Unity中GameObject.SetActive函數和Component.enabled屬性的區別

       我們在Unity項目裏對某個GameObject進行隱藏時,用gameObject.SetActive(false)可以達到目的,也可以對enabled屬性賦值false達到同樣的目的,那麼這兩者究竟有何區別呢,今天我特意寫了一個Demo進行了驗證。

       爲了方便驗證,我特意寫了一個繼承自Image的自定義Class,在主要的生命週期函數裏輸出Log來進行驗證,這裏我使用的是UGUI,MyImage.cs代碼如下:

using UnityEngine;
using UnityEngine.UI;

public class MyImage : Image
{
    protected override void Awake()
    {
        base.Awake();

        Debug.Log("Enter MonoBehaviour MyImage::Awake...");
    }

    // Use this for initialization
    protected override void Start ()
    {
        base.Start();

        Debug.Log("Enter MonoBehaviour MyImage::Start...");
    }

    protected override void OnEnable()
    {
        base.OnEnable();

        Debug.Log("Enter MonoBehaviour MyImage::OnEnable...");
    }

    protected override void OnDisable()
    {
        base.OnDisable();

        Debug.Log("Enter MonoBehaviour MyImage::OnDisable...");
    }

    // Update is called once per frame
    void Update () {
		
	}
}

       再看下面的截圖:

通過驗證後,得到如下結論:

相同點:

1.gameObject.SetActive函數控制的是上圖複選框1是否勾選,不勾選,那麼隱藏,勾選即顯示;

2.enabled屬性控制的是複選框2是否勾選,顯隱規則同上;

不同點:

1.如果UI的複選框1默認不勾選, 無論複選框2是否勾選, 那麼當UI顯示時, MyImage.cs的所有函數都不會執行, 這就說明沒有加載此腳本到內存;

2.如果UI的複選框1默認勾選,複選框2默認不勾選,那麼當UI顯示時, MyImage.cs的Awake函數會執行,其他函數均不會執行,這就說明此腳本會加載到內存中, 除了執行Awake函數外,其他函數均不執行.

 

搞清楚上面的區別之後,那麼我們就不會誤用gameObject.SetActive和enabled了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章