原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】Dotweenの便利なコールバックについて

不正不満を口にする

はてなブログは「画像のアップロードに失敗しました」とかメッセージ出す癖に、ページをリロードするとちゃんと投稿欄にアップロードされているのはやめろ。おかげで同じ動画が投稿欄を埋めて尽くしているんですが。
それからTwitterの「〇〇さんが▲▲さんのツイートにいいねしました」という通知は不要です。私にどうしろというのか。

 

そんな感じで不正不満だけは止まらない屈折した日々を過ごしている所為なのか新作ゲームの進捗はさっぱり進みません。

f:id:Karvan:20190924232422p:plain

この三連休ではアセットストアから敵用のモデルを購入してカスタマイズしたぐらい

 

Dotweenのコールバック

さて、Unityでオブジェクトをアレコレ動かす際にお世話になるDotween
移動(Move)や回転(Rotate)以外にも前回の記事でも使用した経路移動(DoPath)、ジャンプ(DoJump)など、色々便利な関数が用意されているのですが、それと同じようにコールバックも色々なタイミングで使えるように用意されています。

 

  •  OnComplete:Tweener、Sequenceの完了時コールバック
  • OnStart:こちらはTweener、Sequenceの開始時のコールバック

 

おそらく使用頻度が高いのは上記の二つだと思うのですが、これ以外に使い勝手が良いものを上げると

 

・PrependCallback

Tweenerの開始時コールバック
Sequenceの場合は各Tweenerの開始時コールバック
OnStartはSequence全体の開始時ですが、こちらはSequenceの各動作(Tweener)毎の開始前に呼ばれます。

 

・AppendCallback(Sequence用)

Sequenceの各Tweenerの終了時コールバック
OnCompleteと違い各動作(Tweener)毎の完了時に呼ばれます

 

・OnWaypointChange(DOPath、DOLocalPath用)

経路として指定した座標に到達するたびに呼ばれます。
引数としてDOPath,DOLocalPathで指定したVector3配列のIndexが渡されます。

 

 ちょっと使ってみよう

丁度前回の記事でDOLocalPathとDoJumpをSequenceに設定してキャラクターを動かしていたので、それを利用してコールバックの動作を確認しましょう。

 

前回のキャラクター移動

f:id:Karvan:20190917204540g:plain


上の動画では以下の動作をSequenceに設定しています。

  1.  Start~Path3まで:DOLocalPathによる移動
  2. Jump1~Jump3まで:DoJumpを繰り返し
  3. Jump3~Goalまで:DOLocalPathによる移動

f:id:Karvan:20190924233353p:plain

 

ここで、1のDOLocalPathにてOnWaypointChangeを設定しPath1のポイントに達したら、Sequenceを一時停止してキャラクターのAnimationを変更します。

 

まず、Sequence側にOnWaypointChangeを指定します。

    PathSeq.Append(
            myObj.transform.DOLocalPath(Path1Array, 6.0f, PathType.CatmullRom)
                                .SetLookAt(0.05f, Vector3.forward)
                                .OnWaypointChange(x => CallBack_WaitPoint(x))
                                .OnComplete(() => CallBack_Path1())

        );

コールバック関数側でAnimationの変更とSequenceの一時停止、再開を行うようにします

    public void CallBack_WaitPoint(int index)
    {
        if (index == 1)
        {
            // Sequenceの一時停止
            PathSeq.TogglePause();
            
            // 座るAnimation
            myAnim.SetInteger("Animation", 4);

            StartCoroutine(SequenceRestart());
        }
    }

    private IEnumerator SequenceRestart()
    {
        yield return new WaitForSeconds(3.0f);

        // Sequenceの再開
        PathSeq.TogglePause();
        
        // 歩くAnimation
        myAnim.SetInteger("Animation", 1);
    }

次に、2のDoJumpではPrependCallbackを使用して3回目のジャンプ開始前にSequenceを一時停止してキャラクターのAnimationを変更します。

Sequence側にPrependCallbackを指定

   for(int iCnt = 0; iCnt < Jump1Array.Length; iCnt++)
   {
       PathSeq.Append(
               myObj.transform.DOJump(Jump1Array[iCnt], 0.5f, 1, 1.0f)
                               .PrependCallback(() => CallBack_PreJump())
                               .PrependInterval(0.5f)
                               .OnComplete(() => CallBack_CompJump())
           );
   }

コールバック関数側でAnimationの変更とSequenceの一時停止、再開。ここでは回数を計るためにOnCompleteのコールバックにてジャンプの完了回数をカウントアップしています。

    public void CallBack_PreJump()
    {
        // 3回目のジャンプ開始前の場合
        if (JumpComp == 2)
        {
            // Sequenceの一時停止
            PathSeq.TogglePause();
            
            // 座るAnimation
            myAnim.SetInteger("Animation", 4);
            
            
            StartCoroutine(SequenceStepRestart());
            return;
        }

        // ジャンプAnimation
        myAnim.SetInteger("Animation", 2);
    }

    private IEnumerator SequenceStepRestart()
    {
        yield return new WaitForSeconds(3.0f);

        // Sequenceの再開
        PathSeq.TogglePause();
        
        // ジャンプAnimation
        myAnim.SetInteger("Animation", 2);
    }

    public void CallBack_CompJump()
    {
        // ジャンプの完了回数をカウントアップ
        JumpComp++;
    }

これを実際に動作させるとこんな感じになります。

f:id:Karvan:20190922161358g:plain

コールバックを使うと色々な動きが可能となるので積極的に使ってみましょう。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。