Unityでオーディオとかアドとかのマネージャとして、アプリ全体を通して必ずシーン内に存在して欲しいオブジェクトの初期化をどうするか、 結論としてはRuntimeInitializeOnLoadMethodを使うといいよ、という話。
手動のやりかた
エディタでの開発中にタイトルやゲーム中など各シーンで直接作業する場合にそれぞれのシーンに必要なオブジェクトを配置するのは、変更の際にすべてのシーンをいじらないといけないので避けたい。
ひとつの方法として必要なオブジェクトを起動シーンに配置して、未初期化だったら一旦起動シーンに飛ばして再度戻すという方法をとっていた(DontDestroyOnLoad
してあるものとして):
public class BootController : MonoBehaviour { |
各シーンのコントローラのAwake
で必ずBootScene#EnsureBootProcess()
を呼び出してやれば必要なオブジェクトが配置された状態になっている。
しかし問題はいくつかあって、
- 各シーンのコントローラから明示的に呼び出してやる必要がある
- エディタで実行したときに、Hierarchyの状態が初期化されて全部閉じた状態になってしまう
- 各
MonoBehaviour
のAwake
が2回呼び出される
2と3はいったんシーンを遷移しているのでそのようになってしまう。 これがエディタで作業する際に不便だった。
シーンを遷移しない方法
単にプレハブをInstantiate
、またはSceneManager.LoadScene
のAdditive
を使えばよい。
自動的に行うようにする
しかしまだいちいち自分で呼び出さないといけないのメンドイよね…と思ってたら、UnityにRuntimeInitializeOnLoadMethodというアトリビュートがあって これを指定すると起動時の最初に呼び出してくれる:
public class ManagerSceneController { |
BeforeSceneLoad
でシーン読み込み前(Awake
前)、After~
でシーン読み込み後(Awake
後、Start
前)に呼び出される