![見出し画像](https://assets.st-note.com/production/uploads/images/30278972/rectangle_large_type_2_a1d3953c3a492ecdc35574985c61f30f.png?width=1200)
Boltの各GraphでのStart Eventノードの実行タイミング
複数のFlow Graph、State Graphがある場合、Start Eventがどういうタイミングで呼び出されているかは気になるところです。
C#との連携なら Start() や Awake() との呼び出しタイミングも気になります。
その辺を軽く調査してみました。
調査対象
以下の4つの呼び出しタイミングを見てみました。
・C#スクリプトのAwake()
・C#スクリプトのStart()
・Bolt の Flow Machine の Start Eventノード
・Bolt の State Machine の Startノード内 の On Enter State Eventノード
C#スクリプト、BoltのFlow Graph, State Graph 共に複数用意。
確認方法
Unity Editor上で実行した際の呼び出しタイミングを見ました。
(EXE化した際は厳密には少し変わる可能性があるかもしれません)
Visual Studioのブレークポイントを用いて呼び出し順序を確認。
(Debug.Logでは表示遅延がある為)。
Boltのノードにはブレークポイント機能が無いので、Start Event や On Enter Stateノードから確認用に作成したC#のPublic関数を呼び出して、そこでブレークポイントを設定して確認しています。
予備知識
まずUnityの既知の仕様として、
・Awake()はStart()よりも必ず先に呼ばれる。
・複数のC#スクリプトの 各Start()の呼び出し順序は変動することがある。
・複数のC#スクリプトの 各Awake()の呼び出し順序も同様に変動することがある。
結果
以下の2つがまず呼ばれます。
・C#のAwake()
・Bolt の State Machine の Startノード内 の On Enter State Eventノード
ただし各々複数ある場合は混在して呼ばれます。必ずC#のAwake() が最初というわけではありません。BoltのState Machine の Startノード内 の On Enter State Eventノードが一番最初に呼ばれる場合もあります。
上記が全て呼び出し終わると以下が呼ばれます。
・C#のStart()
・Bolt の Flow Machine の Start Eventノード
これも各々複数ある場合混在します。必ずC#のStart() が最初というわけではありません。
Boltに注目すると、
・State Machine の Startノード内 の On Enter State Eventノード
・Bolt の Flow Machine の Start Eventノード
という順に呼ばれています。
補足
各Graph間で変数を参照しているような場合は、初期化時の処理に注意が必要な場合がありそうです。
今回の結果だと呼び出し優先度は2つに分類できて、
・C#のAwake() と Bolt の State Machine の Startノード内 の On Enter State Eventノード は同列。
・C#のStart() と Bolt の Flow Machine の Start Eventノード は同列。
ちなみに同列の中でも呼び出し順序が固定に見えていても、コードやノードを変更して再コンパイルすると同列の中での呼び出し順序は簡単に変わります。
ただし上記で State Machine と Flow Machine の呼び出し順序が必ずこうなるという、Bolt仕様の記載が現状見つけられていない為、あくまで今回の実験結果はこうだったと考えておく方が無難かもしれません。
とりあえずFlow Graphで初期化してる変数をState GraphのStartノードで参照すると、現在のBoltのバージョンでは未初期化な可能性がありえる感じです。