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には保持されたままだ!
気をつけよう。