【Unity】どのシーンから起動しても共通の初期化を呼び出したい

Unityエディタって優秀ですよね。
プレイボタンを押せば、編集中のシーンをいつでも実行できるのは魅力的です。
しかし、ゲームを作ってると、最初に共通の初期化を行いたいケースってあると思います。
C++でコードを書くようにmain関数が上から順に処理されれば分かりやすいですが、Unityではどうでしょう?

Unity - Scripting API: RuntimeInitializeOnLoadMethodAttribute

[RuntimeInitializeOnLoadMethod]

このAttributeが指定されたメソッドは、ゲームがロードされた直後に呼び出されます。
この特徴を利用して、Initializeシーンと、Initialize.csスクリプトを用意します。
(名前は分かりやすければ何でもOKです)

実行すると、現在のシーンにInitializeシーンもロードされるようになるので、初期化用のシーンとしてGameObjectを配置してスクリプトをアタッチしておけば、どのシーンから起動しても共通の初期化を呼び出すことができるようになるわけです。

GameObjectがDontDestroyOnLoadなシングルトンであれば、グローバルなマネージャクラスを作ることもできます。デバッグ用のマネージャクラスなど、どのシーンから起動しても処理したいものはInitializeシーンにまとめるて運用すると大変便利です。

ただし、気を付けなければならい点が2つあります。

1つ目はInitializeシーンは、SceneInBuildの最後に配置する必要があること。
2つ目は処理の流れです。

  1. RuntimeInitializeApplicationが呼び出される
  2. 現在のシーンのオブジェクトのAwakeが呼び出される
  3. InitlizeシーンのオブジェクトのAwakeが呼び出される
  4. 現在のシーンのオブジェクトのStartが呼び出される
  5. InitlizeシーンのオブジェクトのStartが呼び出される

現在のシーンのオブジェクトが先に処理される点に注意してください。
AwakeやStartでInitializeシーンのオブジェクトが依存しないように設計しましょう。