Unity脚本中各函数成员的生命周期

在学习Unity时,掌握如何编写脚本是必须掌握的一项基本技能。但是关于Unity的游戏脚本中各函数的生命周期是怎样开始和结束的,它们的执行顺序是如何安排的?这一点我们要清楚的了解。

我们知道Unity中的脚本大多派生于MonoBehaviour类,所以可以重写MonoBehaviour类里面的方法来实现我们想要的功能。那么自定义脚本中的各函数执行顺序和MonoBehaviour里面的函数执行顺序大致是一样的。

首先介绍一下MonoBehaviour类里面的成员变量和成员函数。

 1 public class MonoBehaviour : Behaviour
 2     {
 3         public MonoBehaviour();
 4 
 5         public bool useGUILayout { get; set; }
 6 
 7         public void CancelInvoke();
 8         public void CancelInvoke(string methodName);
 9         public void Invoke(string methodName, float time);
10         public void InvokeRepeating(string methodName, float time, float repeatRate);
11         public bool IsInvoking();
12         public bool IsInvoking(string methodName);
13         public static void print(object message);
14         public Coroutine StartCoroutine(IEnumerator routine);
15         [ExcludeFromDocs]
16         public Coroutine StartCoroutine(string methodName);
17         public Coroutine StartCoroutine(string methodName, object value);
18         public Coroutine StartCoroutine_Auto(IEnumerator routine);
19         public void StopAllCoroutines();
20         public void StopCoroutine(Coroutine routine);
21         public void StopCoroutine(IEnumerator routine);
22         public void StopCoroutine(string methodName);
23     }

注:对于MonoBehaviour类的成员变量和成员函数,只作一些相关介绍,具体的使用方法在以后会陆续进行举例说明。或者可以参考Unity的API手册。

Variables 变量


 

useGUILayout  禁用此项,将会跳过GUILayout布局阶段


 

Functions 函数


  • Invoke 原型:void Invoke(string methodName,float time);根据时间调用指定方法名的方法。
  • InvokeRepeating 原型:void InvokeRepeating (methodName : string, time : float, repeatRate : float);每隔指定时间调用指定方法名的方法,从第一次调用开始,每隔repeatRate时间调用一次.
  • CancelInvoke 原型:void CancelInvoke ();取消这个MonoBehaviour上的所有调用。void CancelInvoke(string methodName);取消所有名为methodName的调用。
  • IsInvoking 原型:bool IsInvoking(string methodName);某指定函数是否在等候调用。正在调用返回true,否则返回false。
  • StartCoroutine 原型:Coroutine StartCoroutine(IEnumerator routine);开始协同程序。
  • StopCoroutline 停止methodName的所有协同程序。
  • StopAllCoroutline 停止所有动作的协同程序。

 

Overridable Functions 可重写函数


  •  Update 原型:void Update();当MonoBehaviour启用时,Update函数在每一帧被调用。
  • LateUpdate 原型:void LateUpdate();当MonoBehaviour启用时,LateUpdate函数在每一帧被调用。LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。

  • FixedUpdate 原型:void FixedUpdate();当MonoBehaviour启用时,FixedUpdate函数在每一帧被调用。

  • Awake 原型:void Awake();当脚本实例被载入时Awake被调用。Awake用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次。

  • Start 原型:void Start();Start仅在Update函数第一次被调用前调用。和Awake不同的是,Awake函数的调用要早于Start,并且Start函数只在脚本实例被启用时调用。

  • Reset 原型:void Reset();重置为默认值。Reset是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。


 

以上是常用的成员函数,还有一些成员函数是关于鼠标操作事件的,比如:OnMouseOver(),OnMouseEnter()等。

另外OnGUI()函数也是比较常用的,它主要负责窗口控件的渲染和管理。

接下来附上一张官方文档对脚本中各函数生命周期的图表:

图片来源于:http://docs.unity3d.com/Manual/ExecutionOrder.html

可见Unity脚本从创建到销毁是具有一个完整的生命周期的,主要的调用顺序如下:

 

OnGUI函数会在每帧上多次被调用,因为要时刻准备相应里面的GUI事件。

### Unity脚本生命周期解释 #### 初始化阶段 Awake 函数会在对象实例化时立即被调用,这通常用于初始化变量或其他组件之间的连接。此函数在整个生命周期内仅执行一次[^4]。 OnEnable 方法会在 MonoBehaviour 被设置为启用状态时触发,无论是启动场景还是重新激活已停用的对象都会引起该事件的发生。这意味着它可以被执行多次,只要脚本的状态从禁用变为启用就会发生。 Start 是一种特殊的方法,在第一次帧更新之前会被调用,并且只会在脚本处于活动状态下才会运行;如果 GameObject 不活跃,则不会调用 Start[]^4]。 #### 更新循环 FixedUpdate 主要针对物理计算而设计,按照固定的间隔时间(默认每秒50次)来处理与物理学有关的操作,比如移动刚体或应用力矩等操作。 Update 是最常用的一个回调方法之一,它会随着每一帧渲染周期同步地被反复调用,适用于大多数常规的游戏逻辑控制,如输入检测、动画播放以及简单的变换管理等任务。 LateUpdate 同样遵循着逐帧调用的原则,不过它的特别之处在于总是位于同一帧内的所有 Update 完成之后才开始工作,常用来修正由其他脚本引起的视觉变化或是摄像机跟随目标等功能。 #### 销毁阶段 OnDisable 当MonoBehaviour不再有效的时候将会发出信号,即当GameObject上的这个组件失活或者是整个实体本身失去活力的情况下会发生这样的情况。 OnDestroy 则是在游戏对象即将永久消失前一刻得到通知的机会,可以利用这段时间来进行资源清理或者其他必要的收尾动作,例如停止协程或者释放外部链接等等。 ```csharp using UnityEngine; public class LifecycleExample : MonoBehaviour { private void Awake() { Debug.Log("Awake called"); } private void OnEnable() { Debug.Log("OnEnable called"); } private void Start() { Debug.Log("Start called"); } private void FixedUpdate() { Debug.Log("FixedUpdate called"); } private void Update() { Debug.Log("Update called"); } private void LateUpdate() { Debug.Log("LateUpdate called"); } private void OnDisable() { Debug.Log("OnDisable called"); } private void OnDestroy() { Debug.Log("OnDestroy called"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值