スポンサーリンク

【Unity】DoTweenのAppendCallbackで昔ミスったこと※6月23日更新

2019年5月19日DoTween, Unity, 開発

初めてDoTweenを使用したときはAppendCallback()はAppend()の後に呼ばれるくらいにしか認識できていませんでした。。。
それが原因で起こったミスがこちらになります。

サンプルコード1

上記の画像のプログラムを実装してコンソール画面で確認すると、

もちろん i がインクリメントされ上の画像のようなログが表示されます。
では、次のようなプログラムはどうでしょう?

サンプルコード2

先ほどの画像とほとんど同じですね!
変わった点は、Debug.Log() の位置がAppendCallback() で呼ばれるようになった点ですね!

では、このプログラムを実行してみると。。。?

i = 0 で全てのログが出力されている!!!!
どうゆうこと!!?

あのころの私はなぜこのようにログが出力されるかわかっていませんでした。。。

私の想定では

  1. DoAnimTest()が呼ばれる
  2. for文に処理が流れる
  3. DoTween.Sequence()呼ばれる【Append()やJoin()があればここで処理される】
  4. AppendCallback()がよばれる
  5. 3〜4が10回繰り返される
  6. for文を抜ける

でしたが、実際の動きは違っていました。。。
どうやら原因は AppendCallback() がDOTween.Sequence()の最後ではなく、
同フレーム内の最後に呼ばれることにあるようです。
実際の動きは

  1. DoAnimTest()が呼ばれる
  2. for文でDoTween.Sequence()が10回繰り返し呼ばれる
  3. for文を抜ける
  4. 次のフレームに移る前にAppendCallback()が10回呼ばれる

みたいです。
これだと、i のインクリメントが全て終わった後にAppendCallback()が10回呼ばれるので
先ほどのような画像になりますね!!
いや〜。初めてコンソール画面でログを表示させた時は、意味がわからなくてかなり焦りましたよ。。。

まとめ

  1. AppendCallback()は同フレームの最後でよばれます
  2. AppendCallback() の中で引数ありのメソッドを呼ぶ時は注意しよう ※for文の中で実装しているときは特に

6月23日更新 処理順テスト

以下の処理を実行してみました。
Time.frameCount を利用して、別フレームになっていないか、の確認も行います。※こちらはオマケ程度

今回の注目ポイントは、連続でAppendCallbackを呼んでいる
Debug.Log(“C ⇨ ” + Time.frameCount);
Debug.Log(“D ⇨ ” + Time.frameCount);
と次のループで連続でAppendCallbackを呼んでいる
Debug.Log(“H ⇨ ” + Time.frameCount);
Debug.Log(“I ⇨ ” + Time.frameCount);
です。
予想としては以下の2パターンのどちらかになると考えています。
①AppendCallbackが連なったときに、後ろのAppendCallbackの処理は再度一番最後に回されるのか、
この場合は   C ⇨ H ⇨ C ⇨ H ⇨ D ⇨ I  ⇨ D ⇨ I
それとも
②4つあるAppendCallbackが、定義された順なのか(AppendCallbackを2つ繋げても処理タイミングはAppendCallback1つにまとめた場合と同じになるのか)、
この場合は   C ⇨ D ⇨ C ⇨ D ⇨ H ⇨ I  ⇨ H ⇨ I

以下、結果になります。

結果

わかったこと❶
⇨ 全て同じフレームで処理されている
わかったこと❷
⇨ AppendCallbackを2つ繋げてもさらに1段階処理が後ろにずれることはない
  ※ 想定していたパターン②の順に処理が行われるみたいですね!

スポンサーリンク