Unity3D MonoBehaviour的生命周期(lifecycle)

简介: 官方的事件函数的执行顺序中有详解(Link:Execution Order of Event Functions)   (图片来源:http://whatiseeinit.blogspot.com/2012/10/unity3d-monobehaviour-lifecycle.

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

 

(图片来源: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

1

 

当场景卸载时(比如双击切换到另一个场景时,当前场景会被卸载 – 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的值为枚举类型,详细的参数请参考官网>>

目录
相关文章
|
2月前
|
图形学 开发者 UED
Unity游戏开发必备技巧:深度解析事件系统运用之道,从生命周期回调到自定义事件,打造高效逻辑与流畅交互的全方位指南
【8月更文挑战第31天】在游戏开发中,事件系统是连接游戏逻辑与用户交互的关键。Unity提供了多种机制处理事件,如MonoBehaviour生命周期回调、事件系统组件及自定义事件。本文介绍如何有效利用这些机制,包括创建自定义事件和使用Unity内置事件系统提升游戏体验。通过合理安排代码执行时机,如在Awake、Start等方法中初始化组件,以及使用委托和事件处理复杂逻辑,可以使游戏更加高效且逻辑清晰。掌握这些技巧有助于开发者更好地应对游戏开发挑战。
117 0
|
3月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
75 0
|
5月前
|
程序员 图形学 Android开发
Unity脚本生命周期
Unity脚本生命周期
|
11月前
|
图形学
Unity 脚本的生命周期
Unity 脚本的生命周期
|
图形学 C++
Unity-生命周期
Unity-生命周期
124 0
|
图形学
Unity脚本声明周期和MonoBehaviour常用方法
Unity脚本声明周期和MonoBehaviour常用方法
122 0
|
图形学
一文读懂Unity常用生命周期函数! 超级详细、不服来辩~
零基础学习Unity常用什么周期函数,超级详细的解析,不看会后悔哦~
6633 0
一文读懂Unity常用生命周期函数! 超级详细、不服来辩~
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity脚本生命周期
Unity小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】☀️ | Unity脚本生命周期