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