Unity3D MonoBehaviour的生命周期(lifecycle)

时间:2022-12-28 16:20:55

官方的事件函数的执行顺序中有详解(Link:Execution Order of Event Functions

 

Unity3D MonoBehaviour的生命周期(lifecycle)

(图片来源:http://whatiseeinit.blogspot.com/2012/10/unity3d-monobehaviour-lifecycle.html

 

通过实际操作来测试上述的流程:

1、新建一个场景:LifecycleTest

2、在同级目录下新建一个C#脚本:LifecycleTest.cs,代码如下:

using System;
using UnityEngine;

[ExecuteInEditMode]
public class LifecycleTest : MonoBehaviour {

private void Awake()
{
Debug.Log(
"Awake" + DateTime.Now.ToString());
}

private void Reset()
{
Debug.Log(
"Reset" + DateTime.Now.ToString());
}

private void OnEnable()
{
Debug.Log(
"OnEnable" + DateTime.Now.ToString());
}

private void OnDisable()
{
Debug.Log(
"OnDisable" + DateTime.Now.ToString());
}

private void OnDestroy()
{
Debug.Log(
"OnDestroy" + DateTime.Now.ToString());
}


// Use this for initialization
void Start () {
Debug.Log(
"Start" + DateTime.Now.ToString());
}

// Update is called once per frame
void Update () {
Debug.Log(
"Update" + DateTime.Now.ToString());
}
}

3、将LifecycleTest.cs脚本拖拽至LifecycleTest场景的主相机(Main Camera)上(或者选中主相机,在检视图 — Inspector 中最底部按钮 Add Component,输入“LifecycleTest”然后回车,将选中的脚本附加到主相机中);

4、此时,控制台上将能看到相应的输出

Awake –> OnEnable –> Reset –> Start –> Update

Unity3D MonoBehaviour的生命周期(lifecycle)

 

当场景卸载时(比如双击切换到另一个场景时,当前场景会被卸载 – unload),此时会触发:

OnDisable –> OnDestroy

当场景被载入时(load)

Awake –> OnEnable –> Start –> Update

当C#脚本被修改时(Modified)时

OnDisable –> OnEnable

 

我们会发现上面有二对相对应的函数:

Awake —— OnDestroy

OnEnable —— OnDisable

卸载时是 OnDisable –> OnDestroy,加载时是 Awake –> OnEnable。

 

 

注意动态创建的实例对象,记得显示设置隐藏标记(HideFlags)以便更加准确控制其生命周期,避免报错或其它意外的发生。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
// Creates a material that is explicitly created & destroyed by the component.
// Resources.UnloadUnusedAssets will not unload it, and it will not be editable by the inspector.
private Material ownedMaterial;
void OnEnable()
{
ownedMaterial
= new Material(Shader.Find("Diffuse"));
ownedMaterial.hideFlags
= HideFlags.HideAndDontSave;
GetComponent
<Renderer>().sharedMaterial = ownedMaterial;
}

// Objects created as hide and don't save must be explicitly destroyed by the owner of the object.
void OnDisable()
{
DestroyImmediate(ownedMaterial);
}
}

 

HideFlags的值为枚举类型,详细的参数请参考官网>>