我們在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了.