不正不満を口にする
はてなブログは「画像のアップロードに失敗しました」とかメッセージ出す癖に、ページをリロードするとちゃんと投稿欄にアップロードされているのはやめろ。おかげで同じ動画が投稿欄を埋めて尽くしているんですが。
それからTwitterの「〇〇さんが▲▲さんのツイートにいいねしました」という通知は不要です。私にどうしろというのか。
そんな感じで不正不満だけは止まらない屈折した日々を過ごしている所為なのか新作ゲームの進捗はさっぱり進みません。
この三連休ではアセットストアから敵用のモデルを購入してカスタマイズしたぐらい
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に設定してキャラクターを動かしていたので、それを利用してコールバックの動作を確認しましょう。
前回のキャラクター移動
上の動画では以下の動作をSequenceに設定しています。
- Start~Path3まで:DOLocalPathによる移動
- Jump1~Jump3まで:DoJumpを繰り返し
- Jump3~Goalまで:DOLocalPathによる移動
ここで、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++; }
これを実際に動作させるとこんな感じになります。
コールバックを使うと色々な動きが可能となるので積極的に使ってみましょう。