yotiky Tech Blog

とあるエンジニアの備忘録

MonoBehaviourのコンストラクタ/デストラクタ

Unity 基礎シリーズ 目次

目次

検証環境

Unity:2017.4.5f1

MonoBehaviourのコンストラクタ/デストラク

MonoBehaviourを継承したクラスではコンストラクタを書いて初期化をせず、イベント関数のAwakeやStartの中で初期化する。Unityの鉄則の一つ。
理由は、クラスがインスタンス化されるタイミングが分からない上に、実行時以外にもインスタンス化と破棄が繰り返し行われているのと、もうひとつはUnityEngine.Objectのコンストラクタは別スレッドで呼ばれるとのこと。1 実際にMonoBehaviourのコンストラクタ/デストラクタの処理が走るタイミングは次のようになった。GameObject3-1はNon-activeにしてある。末尾はインスタンス判別用の識別子。

f:id:yotiky:20181122094239p:plain

  1. Editor上でPlay

    1. GameObject1.Destructor: 0e031e
    2. GameObject2.Destructor: 9ac3b8
    3. GameObject2-1.Destructor: 8551b3
    4. GameObject3.Destructor: dc8392
    5. GameObject3-1.Destructor: 808b20
    6. GameObject1-1.Destructor: 8f06af

    7. GameObject1-1.Constructor : 9884aa

    8. GameObject2.Constructor : 9fb890
    9. GameObject2-1.Constructor : f9fe82
    10. GameObject1.Constructor : 55321f
    11. GameObject3-1.Constructor : 28671f
    12. GameObject3.Constructor : 1fe677

    13. GameObject3-1.Constructor : 8841c6 (GameObject non-active)

    14. GameObject1-1.Constructor : 216283
    15. GameObject2.Constructor : fac40a
    16. GameObject2-1.Constructor : bcab4a
    17. GameObject3.Constructor : 3f2e53
    18. GameObject1.Constructor : c7c2ac

    19. GameObject1-1.Awake : 216283

    20. GameObject2.Awake : fac40a
    21. GameObject2-1.Awake : bcab4a
    22. GameObject3.Awake : 3f2e53
    23. GameObject1.Awake : c7c2ac

    24. GameObject2-1.Destructor: f9fe82

    25. GameObject2.Destructor: 9fb890
    26. GameObject1.Destructor: 55321f
    27. GameObject3-1.Destructor: 28671f
    28. GameObject1-1.Destructor: 9884aa
    29. GameObject3.Destructor: 1fe677
  2. Editor上でStop

    1. GameObject3-1.Constructor : 2d3d8b
    2. GameObject1-1.Constructor : c72899
    3. GameObject2.Constructor : 28c597
    4. GameObject2-1.Constructor : 7e0981
    5. GameObject3.Constructor : 3f5c8f
    6. GameObject1.Constructor : a22ef8

    7. GameObject3-1.Destructor: 8841c6

    8. GameObject2-1.Destructor: bcab4a
    9. GameObject2.Destructor: fac40a
    10. GameObject1-1.Destructor: 216283
    11. GameObject1.Destructor: c7c2ac
    12. GameObject3.Destructor: 3f2e53

Editor上でPlayするとまずインスタンスの破棄が行われる。その後2度インスタンスが生成されひとつはすぐに破棄される。また、Stopした際にはPlay中のインスタンスは破棄され新たなインスタンスが生成される。 Play/Stopの有無にかかわらず、Editor上での編集中やComponentをアタッチした際にも裏で生成と破棄が繰り返し行われている。最初に破棄されたインスタンスや最後に生成されたインスタンスは編集用のインスタンスであろう。

まとめ

MonoBehaviourを継承したクラスではコンストラクタで初期化は行わない鉄則は守る。
GameObjectはActiveかどうかにかかわらずまずインスタンスが生成され、イベント関数同様にGameObject全体のインスタンスを生成した後、Awakeの処理に移る。