目次
検証環境
Unity:2017.4.5f1
MonoBehaviourのコンストラクタ/デストラクタ
MonoBehaviourを継承したクラスではコンストラクタを書いて初期化をせず、イベント関数のAwakeやStartの中で初期化する。Unityの鉄則の一つ。
理由は、クラスがインスタンス化されるタイミングが分からない上に、実行時以外にもインスタンス化と破棄が繰り返し行われているのと、もうひとつはUnityEngine.Objectのコンストラクタは別スレッドで呼ばれるとのこと。1
実際にMonoBehaviourのコンストラクタ/デストラクタの処理が走るタイミングは次のようになった。GameObject3-1はNon-activeにしてある。末尾はインスタンス判別用の識別子。
Editor上でPlay
- GameObject1.Destructor: 0e031e
- GameObject2.Destructor: 9ac3b8
- GameObject2-1.Destructor: 8551b3
- GameObject3.Destructor: dc8392
- GameObject3-1.Destructor: 808b20
GameObject1-1.Destructor: 8f06af
GameObject1-1.Constructor : 9884aa
- GameObject2.Constructor : 9fb890
- GameObject2-1.Constructor : f9fe82
- GameObject1.Constructor : 55321f
- GameObject3-1.Constructor : 28671f
GameObject3.Constructor : 1fe677
GameObject3-1.Constructor : 8841c6 (GameObject non-active)
- GameObject1-1.Constructor : 216283
- GameObject2.Constructor : fac40a
- GameObject2-1.Constructor : bcab4a
- GameObject3.Constructor : 3f2e53
GameObject1.Constructor : c7c2ac
GameObject1-1.Awake : 216283
- GameObject2.Awake : fac40a
- GameObject2-1.Awake : bcab4a
- GameObject3.Awake : 3f2e53
GameObject1.Awake : c7c2ac
GameObject2-1.Destructor: f9fe82
- GameObject2.Destructor: 9fb890
- GameObject1.Destructor: 55321f
- GameObject3-1.Destructor: 28671f
- GameObject1-1.Destructor: 9884aa
- GameObject3.Destructor: 1fe677
Editor上でStop
- GameObject3-1.Constructor : 2d3d8b
- GameObject1-1.Constructor : c72899
- GameObject2.Constructor : 28c597
- GameObject2-1.Constructor : 7e0981
- GameObject3.Constructor : 3f5c8f
GameObject1.Constructor : a22ef8
GameObject3-1.Destructor: 8841c6
- GameObject2-1.Destructor: bcab4a
- GameObject2.Destructor: fac40a
- GameObject1-1.Destructor: 216283
- GameObject1.Destructor: c7c2ac
- GameObject3.Destructor: 3f2e53
Editor上でPlayするとまずインスタンスの破棄が行われる。その後2度インスタンスが生成されひとつはすぐに破棄される。また、Stopした際にはPlay中のインスタンスは破棄され新たなインスタンスが生成される。 Play/Stopの有無にかかわらず、Editor上での編集中やComponentをアタッチした際にも裏で生成と破棄が繰り返し行われている。最初に破棄されたインスタンスや最後に生成されたインスタンスは編集用のインスタンスであろう。
まとめ
MonoBehaviourを継承したクラスではコンストラクタで初期化は行わない鉄則は守る。
GameObjectはActiveかどうかにかかわらずまずインスタンスが生成され、イベント関数同様にGameObject全体のインスタンスを生成した後、Awakeの処理に移る。