如果熟悉任何一种GUI开发,比如Android,我们会知道其中Activity就有好几个生命周期函数,分别在界面创建、获取焦点、暂停、销毁等时机被回调。在Unity中也是类似的。只不过游戏开发和传统的GUI开发略有不同,游戏中的逻辑是按帧或物理时序循环调用的,而传统GUI界面都是基于事件的。
这里我们直接给出Unity文档中的一张图:
虽然图画的很复杂,但我们如果熟悉游戏引擎架构,就会知道无论是游戏脚本,还是各种GUI框架,其实都大同小异。这里我们介绍几个最常用的生命周期回调函数。
Awake()
;脚本实例被载人时就会调用,整个生命周期中只会调用一次。Start()
:在第一次帧逻辑循环前调用,但在Awake()
之后,整个生命周期中只会调用一次。FixedUpdate()
:基于物理时序循环调用,默认调用间隔固定为0.02s
,可以在Project Settings -> Time
中查看修改。Update()
:基于帧循环调用,调用频率和帧数(也就是说计算机的显示性能)相关,每帧调用。LateUpdate()
:在场景中所有脚本的Update()
执行完后,会调用LateUpdate()
,因此该函数也是每帧调用。OnDestroy()
:组件销毁时调用。注:LateUpdate()
可以起到保证多个游戏对象的逻辑调用顺序的作用,因为场景中多个游戏对象的Update()
调用是没有顺序的,把一段逻辑放在LateUpdate()
中,可以保证该逻辑在所有Update()
之后执行。
我们可以写一个简单的脚本进行测试:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyTest : MonoBehaviour
{
void Awake()
{
Debug.Log("Awake");
}
void Start()
{
Debug.Log("Start");
// 3s后自动销毁
Destroy(this.gameObject, 5f);
}
void FixedUpdate()
{
Debug.Log("FixedUpdate: " + Time.deltaTime);
}
void Update()
{
Debug.Log("Update: " + Time.deltaTime);
}
void LateUpdate()
{
Debug.Log("LateUpdate");
}
void OnDestroy()
{
Debug.Log("OnDestroy");
}
}