在 Unity 场景转换过程中,Awake、Start 和 Update 函数的调用情况如下:
Awake 函数
Awake 函数会在脚本实例被创建时调用,对于场景转换来说:
调用时机:当一个场景加载完成,场景中所有游戏对象上的脚本的 Awake 函数都会被调用,而且在所有脚本的 Start 函数之前调用。如果场景之间存在一些游戏对象是通过 DontDestroyOnLoad 方法使其在场景切换时不被销毁 ,那么这些对象上脚本的 Awake 函数在新场景加载时 不会再次调用,因为它们并没有重新创建。
用途:通常用于游戏对象的初始化,比如获取组件引用(GetComponent)、初始化变量等。由于它在所有脚本的 Start 之前调用,而且一定会在游戏对象可用时调用,所以适合做一些依赖于游戏对象创建完成的基础设置。
Start 函数
Start 函数在脚本实例启用后调用,在场景转换中的调用情况是:
调用时机:当场景加载完成,游戏对象上脚本的 Awake 函数执行完毕后,会接着执行 Start 函数。但是对于那些通过 DontDestroyOnLoad 方法保留下来的游戏对象,在新场景加载后,其脚本的 Start 函数 不会再次调用,因为这些脚本实例没有重新启用的过程。
用途:常用于初始化一些需要在 Awake 之后,并且在游戏开始运行时才进行的操作,比如初始化一些需要依赖其他对象已经初始化完成的变量或逻辑。
Update 函数
Update 函数会在每一帧调用,在场景转换中的调用情况是:
调用时机:只要脚本所在的游戏对象处于启用(enabled 为 true)状态,并且所属的场景已经加载完成,Update 函数就会在每一帧被调用。对于使用 DontDestroyOnLoad 保留的游戏对象,在新场景加载后,只要它们没有被禁用,其脚本的 Update 函数会继续按照帧率正常调用。
用途:主要用于实现游戏中的实时逻辑,像处理玩家输入(如检测按键是否按下)、更新游戏对象的位置和状态(例如移动角色)等。
下面是一个简单的示例代码,帮助你理解它们的调用顺序:
csharp
using UnityEngine;
public class LifecycleExample : MonoBehaviour
{
private void Awake()
{
Debug.Log($“在 {name} 上 Awake 被调用”);
}
private void Start()
{
Debug.Log($"在 {name} 上 Start 被调用");
}
private void Update()
{
Debug.Log($"在 {name} 上 Update 被调用");
}
}
将上述脚本挂载到场景中的游戏对象上,运行游戏,观察控制台输出的日志,就能看到它们的调用顺序。当进行场景切换时,通过对游戏对象使用或不使用 DontDestroyOnLoad 方法,进一步验证它们在场景转换时的调用特性。