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了.

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