シーン内GameObjectの初期化の順序などについて
シーン内GameObjectの初期化の順序について、私はごく最近まで「シーン内のGameObjectは入れ子構造の親から順に初期化、子はシーンの上にあるものから順に初期化」される、と勘違いしていました。
+GameObject1 | | | +---GameObject2 | +---GameObject3
なら、GameObject1, GameObject2, GameObject3の順で・・
ただ実際は「初期化順は不定」なのですね。今開発中のアプリで、起動時は期待した順にAwake()が呼び出されるのに、SceneManager.LoadScene()するとAwake()の呼び出し順序が入れ替わってしまう、という問題が発生し、この事実を知りました。
そうすると、GameObjectの初期化時に他のGameObjectを参照する必要がある場合、どうするのだとうと。例えばGameObject2の初期化時に、GameObject1のなんらかを参照する場合、GameObject1が初期化されていないと期待の動作となりません。
これについては、
- 自身の初期化はAwake()で
- 他のGameObjectの参照を伴う初期化処理はStart()で
行う、と徹底すればよいようですね。
初歩的なことなのですが、いままでずっと勘違いをしていました。これまで開発したアプリは「たまたま動いていた」ようで・・