万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

GameObjectのactiveについて確認 Unity

GameObjectを一旦"非アクティブ"にしてまた"active"にしたら変数とかAwakeとかStartとかどうなるか、
曖昧な認識だったので実験した。

実験としては、Main Cameraに↓のGUITest.csをアタッチ

・GUITest.cs

using UnityEngine;

public class GUITest : MonoBehaviour
{
    private GameObject _go;
    private bool _on;

    void Start()
    {
        _go = GameObject.Find("Cube");
    }

    void OnGUI()
    {
        if (GUI.Button (new Rect (20, 70, 80, 20), "Test"))
        {
            _on = !_on;
            _go.SetActiveRecursively(_on);
        }
    }
}

さらに、「Cube」のGameObjectを作成し、
それに↓をアタッチ

・ActiveTest.cs

using UnityEngine;

public class ActiveTest : MonoBehaviour
{
    private int _num = 3;

    void Awake()
    {
        Debug.Log("Awake?");
        _num = 10;
    }

    void Start()
    {
        Debug.Log("Start?");
    }

    void Update()
    {
        Debug.Log(_num);
    }
}

画面としてはこのようになる。


Awake()やStart()メソッドに関して
これらのログは最初にシーンを再生した時だけで、

        Debug.Log("Awake?");
        Debug.Log("Start?");

ボタンをオン・オフして("Cube"のGameObjectがactiveと非アクティブ)も、呼ばれなかった。
「OnEnable()」メソッドは、アタッチされているGameObjectが"active"になった瞬間に呼ばれるものだが、
OnEnable()メソッドをわざわざUnityが用意してるんだから"active"時にはやっぱり"呼ばれない"のだな。

ちなみに実行順は、
「Awake→OnEnable→Start」だ。


あと、変数に関して
一旦、非アクティブになってactiveになったとしても
Awake()メソッドに書いてある「_num = 10;」が実行されないが、
Update()メソッドに書いたログから"10"が出たので、非アクティブにしても
変数_numには保持されたままだ!
気をつけよう。