zl程序教程

您现在的位置是:首页 >  后端

当前栏目

unity 使用GameObject.SetActive(true)激活对象时,会在SetActive内部调用Awake和OnEnable函数

对象 函数 调用 Unity 内部 激活 True 使用
2023-09-27 14:25:33 时间
using System;
using UnityEngine;
public class Foo:MonoBehaviour{
    private void Awake(){
        Debug.Log("Foo.Awake();");
    }
    private void OnEnable(){
        Debug.Log("Foo.OnEnable();");
    }

    private void Start(){
        Debug.Log("Foo.Start();");
    }
}
using System;
using UnityEngine;

public class Test:MonoBehaviour{
    
    public GameObject foo2;//Hierarchy面板中绑定Foo脚本的GameObject(未激活、在绑定Test脚本的GameObject上方)
    
    private void Start(){
        //Test1();
        Test2();
    }
    
    private void Test1(){
        GameObject fooGameObject=new GameObject("Foo",typeof(Foo));
        //创建GameObject后即使立刻SetActive(false),绑定代码中的Awake与OnEnable函数也会触发
        fooGameObject.SetActive(false);
        /*output:
        Foo.Awake();
        Foo.OnEnable();
        */
        
        Debug.Log("fooGameObject.SetActive(true); Start");
        fooGameObject.SetActive(true);
        Debug.Log("fooGameObject.SetActive(true); End");
        //在SetActive(true)函数内调用OnEnable函数
        /*output:
        fooGameObject.SetActive(true); Start
        Foo.OnEnable();
        fooGameObject.SetActive(true); End
        Foo.Start();
        */
    }
    
    private void Test2(){
        Debug.Log("fooGameObject.SetActive(true); Start");
        foo2.SetActive(true);
        Debug.Log("fooGameObject.SetActive(true); End");
        //在SetActive(true)函数内调用Awake与OnEnable函数
        /*output:
         fooGameObject.SetActive(true); Start
         Foo.Awake();
         Foo.OnEnable();
         fooGameObject.SetActive(true); End
         Foo.Start();
         */
         
    }
}

总结:
当调用GameObject. SetActive(true)方法激活对象时,会在方法内部调用Awake和OnEnable函数,然后才调用Start函数。
Awake与Start函数不管吊销和激活多少次都只会调用一次。