UnityのスクリプトでAwake, Start, Updateはどのタイミングで呼び出されるのか。
特にGameObjectに対してSetActiveをtrueにしたりfalseにしたりするときAwake, Start, Updateはどうなるのか調べました。
まずはレファレンスを調べると、
MonoBehaviour
Awake スクリプトのインスタンスがロードされたときに呼び出されます
Start Start はスクリプトが有効で、Update メソッドが最初に呼び出される前のフレームで呼び出されます
Update Update は MonoBehaviour が有効の場合に、毎フレーム呼び出されます
ちなみにUnityではコンストラクタ、デストラクタは使ってはいけないようだ。(実際使ってみたらよくわからないところでコンストラクタやデストラクタが呼ばれていた。)
Awakeが通常のコンストラクタに近い様子。
StartはUpdateの前のフレームで呼び出されるとかなんだかちょっと扱いにくいと思うのは私だけか。。
Updateは特に真新しいことはないようだ。
ここからはアクティブのときとそうでないとき、切り替えた時の挙動について。
- Hierarchyのツリーでアクティブの場合
Awake→Start→Updateの順で呼び出される。これは予想どおり。
- Hierarchyのツリーで非アクティブの場合
何も呼ばれない。これは当然。ただこの状態だとGameObject.Find()でも見つからないのでちょっと扱いにくい。
ツリーの子ならばthis.transform.Find().gameObjectで見つかるから作る時に構造を気をつける必要がある。
- スクリプトから非アクティブのGameObjectをアクティブにした場合
SetActive(true)→Awake→Start→Update→SetActive(false)→(何も呼ばれない)→SetActive(true)→Updateの順で呼び出される。
つまりAwakeとStartはアクティブにしたときの初回の一回だけ呼び出され、それ以降はもう呼び出されることはない。
GameObjectを使い回す場合、AwakeやStartで初期化されると思っていると予期せぬ動作になるので注意。
おまけ
GameObjectを破棄する場合Destroyを呼び出すけど、呼び出してすぐ消えてくれるわけではないのはガベージコレクションのこともあるのでそうは思っていたけど、裏でしっかり動いている場合もあるみたいなのでちょっと怖い。要注意。