Unity 3 D基礎知識(一)MonoBehaviourスクリプト内蔵関数実行順序テスト

2906 ワード

質問:Unity 3 Dプロジェクトでは、初期化コードをAwake()、Start()、OnEnable()関数に書くべきか分からないことがよくあります。


テスト:直接コード

using UnityEngine;

public class test_MonoBehaviour : MonoBehaviour
{
    public static string pressKey = string.Empty;
    void Awake()
    {
        Debug.Log("-----Awake-----" + pressKey);
    }
    void Start()
    {
        Debug.Log("-----Start-----" + pressKey);
    }

    void OnEnable()
    {
        Debug.Log("-----OnEnable-----" + pressKey);
    }
    void OnDisable()
    {
        Debug.Log("-----OnDisable-----" + pressKey);
    }
    void OnDestroy()
    {
        Debug.Log("-----OnDestroy-----" + pressKey);
    }
}
using UnityEngine;

public class test_MonoBehaviourCtrl : MonoBehaviour
{
    GameObject testDestroyObj;
    void Update()
    {
        if (Input.GetKeyUp(KeyCode.A))
        {
            test_MonoBehaviour.pressKey = "A";
            /// ///
            testDestroyObj = new GameObject("testDestroyObj");
            testDestroyObj.AddComponent();
            Debug.Log("-----AddComponent-----" + testDestroyObj);
        }
        else if (Input.GetKeyUp(KeyCode.S))
        {
            test_MonoBehaviour.pressKey = "S";
            ///Destroy ///
            Destroy(testDestroyObj);
            Debug.Log("-----Destroy-----" + testDestroyObj);
        }
        else if (Input.GetKeyUp(KeyCode.D))
        {
            test_MonoBehaviour.pressKey = "D";
            ///DestroyImmediate ///
            DestroyImmediate(testDestroyObj);
            Debug.Log("-----DestroyImmediate-----" + testDestroyObj);
        }
    }
}
最初に「A」を押すと出力:
-----Awake-----A
-----OnEnable-----A
-----AddComponent-----testDestroyObj (UnityEngine.GameObject)
-----Start-----A
「S」を押すと出力:
-----OnDisable-----S
-----Destroy-----testDestroyObj (UnityEngine.GameObject)
-----OnDestroy-----S
2回目に「A」を押すと出力:
-----Awake-----A
-----OnEnable-----A
-----AddComponent-----testDestroyObj (UnityEngine.GameObject)
-----Start-----A
「D」を押すと出力:
-----OnDisable-----D
-----OnDestroy-----D
-----DestroyImmediate-----null

まとめ:


1.GameObjectにスクリプトを追加すると、AwakeとOnEnableは関数内の他の操作よりも先に実行されます。スタートは少し遅れます 


2.後続コードで使用する初期化内容は、Awake()関数に書かなければなりません。例えば、後続コードはスクリプトに入ったばかりの初期化設定を使用する必要があります。OnEnable()はアクティブになるたびに呼び出されます。一般にアクティブ化後の初期化操作に用いる. 


4.Destroy関数を用いる物を削除する、物に対して~=null等の判断を直接行うことができない.同じフレーム内で、このアイテムは本当に削除されていないからです。これは特に注意しなければならない。 


5.DestroyImmediateを使用するノードを削除すると、本格的な削除となり、後続のコードは~=nullの判定で正しい値を返すことができる.しかし、公式にはこの関数の使用は推奨されていません。また、資源タイプの物体は、この関数を用いて削除することはできない.


残された問題:


Destroy()を使用してアイテムを削除し、後続のコードを誤ってアクセスさせない方法