unity 使用GameObject.SetActive(true)激活对象时,会在SetActive内部调用Awake和OnEnable函数
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函数不管吊销和激活多少次都只会调用一次。