万年素人からHackerへの道

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

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

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