Tutti Lab

元シリコンバレー在住のおっさん技術者、モバイルVRアプリ開発に挑戦中

シーン内GameObjectの初期化の順序などについて

シーン内GameObjectの初期化の順序について、私はごく最近まで「シーン内のGameObjectは入れ子構造の親から順に初期化、子はシーンの上にあるものから順に初期化」される、と勘違いしていました。

+GameObject1
|    |
|    +---GameObject2
|    +---GameObject3

なら、GameObject1, GameObject2, GameObject3の順で・・
ただ実際は「初期化順は不定」なのですね。今開発中のアプリで、起動時は期待した順にAwake()が呼び出されるのに、SceneManager.LoadScene()するとAwake()の呼び出し順序が入れ替わってしまう、という問題が発生し、この事実を知りました。

そうすると、GameObjectの初期化時に他のGameObjectを参照する必要がある場合、どうするのだとうと。例えばGameObject2の初期化時に、GameObject1のなんらかを参照する場合、GameObject1が初期化されていないと期待の動作となりません。
これについては、

  • 自身の初期化はAwake()で
  • 他のGameObjectの参照を伴う初期化処理はStart()で

行う、と徹底すればよいようですね。

初歩的なことなのですが、いままでずっと勘違いをしていました。これまで開発したアプリは「たまたま動いていた」ようで・・