kumak1’s blog

kumak1のイラストや技術ログ

Unity のイベント実行順序で気をつける点などメモ

Unity で Bone を Animator からではなく C#から制御をしたい(自作物理演算などを用いて動的に)場合などは、スクリプトの実行順序に気をつける必要があるのでメモを残します。

実行順序のメモ

C#の関数の呼び出し順序

Unity を用いた開発をする際、なにかと参照するやつ。 FixedUpdatemore than once per frame を初めてみた and 理解した時は「だから複数回呼ばれて変な挙動を・・ちゃんとマニュアルよも」と思ったのでした。

docs.unity3d.com

(余談だけど ベクトル演算を理解する もよくカンペとして一緒に開いてた。便利ページですよね)

Component の順序

Unity で自作した Component は、特に指定しない限りは順不同で実行される。 プロジェクトの Script Execution Order に各クラスの実行順を指定すると色々できるようだが・・数あると破綻しそう

docs.unity3d.com

Hierarchy の順序

Hierarchy に配置されてるどの GameObject から、Component が実行されていくのかも決まっていない。 (動的に生成しまくるし、いちいち順番管理できないのは、それはそう)

どうしても重要な場合はシングルトンからGameObjectの取得・都合よくソート・キックしてまわるようにしよう。

併せて読みたい

UniTask を利用している場合

tech.cygames.co.jp

UniTask を用いた際のイベント実行順序(UniTaskが差し込んだ箇所)についてわかりやすく解説されています。

kumak1はどんなことに利用した?

  • JobSystem を利用したマルチスレッド実装する際、どのタイミングでキューを発行して、どのタイミングまで待てるのか、を判断できるようになった。
  • 自作の物理演算の更新を、適切なタイミングに配置できた
    • Animator Component の Update でアニメーション適用した後・・など(1フレームずれてめり込まないように)
  • Animator だけでなく、物理演算の挙動も含めた形でリミテッドアニメを実装するのに役に立った
    • Bone の Quaternion は全て演算するが、画面レンダリング直前でキーフレームの Quaternion に差し替えて実現

理解を深めて、やりたいことをやれるようにしよう