欢迎大家继续学习 Unity 游戏编程基础 本节我们学习
Unity 中脚本的生命周期 Unity 采用 C#
语言编写游戏脚本 对于普通 C# 控制台程序, Main 函数是它的主入口
Unity 脚本中没有类似的 Main 函数作为程序的主入口
Unity 在游戏运行的各个阶段会调用脚本的事件函数,例如 Start 函数和
Update 函数 执行这些函数内部的脚本逻辑,这些事件函数均继承至
Unity 脚本的默认基类 MonoBehavior。
MonoBehavior 基类定义的 Unity 事件函数,Unity 项目在运行时
会在特定时刻调用相应的事件函数 所有函数的调用轨迹形成了 Unity 脚本的生命周期
本页 PPT 给出脚本生命周期中常用的事件函数,下面我们简要介绍这些事件函数的使用方法 本页
PPT 给出 Unity 脚本生命周期的流程图 我们首先介绍
Reset 函数,使用 Unity 编辑器将脚本绑定到游戏对象时,编辑器调用
Reset 函数 下面介绍游戏运行时脚本函数的调用顺序。
首先是初始化阶段 第一个被调用的函数是 Awake 函数,它在脚本绑定到的游戏对象激活时执行
这里需要注意:即使包含 Awake 函数的脚本组已禁用状态 该脚本中的
Awake 函数也会被 Unity 调用 初始化阶段第二个执行的函数是
OnEnable,当脚本启用时该函数执行一次 初始化阶段最后调用
Start 函数 它在 OnEnable 函数调用后执行。
这里需要注意: Start 在每个场景中只执行一次,如果在场景中已经执行过
Start 函数 即使 OnEnable 函数再次执行,Start
函数也不会执行 初始化阶段完成后进入游戏脚本的循环阶段
首先介绍物理循环,物理循环用于处理游戏中与物理相关的逻辑 FixedUpdate
函数是物理循环中最先执行的函数 它每隔固定时间执行一次,我们通常与把物理模拟有关的代码
写在 FixedUpdate 函数中,比如给游戏对象添加力 其次是
OnTrigger 函数,它用于 Trigger 触发器检测 每隔固定时间检测一次。
触发器检测函数包括 OnTriggerEnter,OnTriggerStay,OnTriggerExit
当物体进入,停留,离开 Trigger 触发器范围时执行 接下来是
OnCollision 碰撞检测函数 它用于 Collider 碰撞体的相关检测,每隔固定时间检测一次。
碰撞检测函数包括 OnCollisionEnter OnCollisionStay,OnCollisionExit,当物体进入,停-
留,离开 Collider 碰撞体范围时执行 OnTrigger 函数与 OnCollision
函数通常用于与碰撞检测有关的游戏逻辑 接下来是 OnMouse
函数,处理鼠标的输入事件 下面是游戏逻辑循环。
在游戏逻辑中首先执行 Update
函数 它在每帧执行一次,该函数主要处理游戏对象在游戏世界的行为逻辑
例如游戏角色的控制和游戏状态的控制 然后是 LateUpdate
函数,它也是每帧执行一次,在 Update 函数后执行。
在实际开发过程中 Update 函数与 LateUpdate 函数通常共同使用,例如在第三人称射击游戏中
我们在 Update 函数中处理玩家角色的移动,在 LateUpdate
函数中处理摄像机跟随玩家 这样能防止摄像机出现抖动现象。
游戏逻辑程序循环结束后执行 OnGUI 函数 OnGUI
函数每帧可执行多次,用于绘制 Unity 的图形用户界面
在脚本被禁用前,Unity 循环调用
PPT 中红色椭圆内的函数序列,实现游戏对象的正常更新
脚本被禁用时,脚本跳出之前红色椭圆内的函数循环 调用 OnDisable 函数,等待下一个命令。
若重新启用脚本 脚本将从 OnDisable 函数跳转至 OnEnable
函数 跳转完成后,脚本按照生命周期中函数执行顺序
循环运行,直到下一次脚本被禁用。
当脚本 被解除绑定时,Unity 调用 OnDestroy
函数,脚本的生命周期结束 我们把前面介绍的脚本生命周期中全部相关函数写到一个测试脚本中
测试脚本运行后,控制台显示的函数执行顺序 如右图所示,与我们之前介绍的函数执行顺序一致
最后我们介绍多个脚本之间的执行顺序 游戏场景中往往存在多个
Unity 脚本,这些脚本都包含了 Unity 的事件函数,如 Start 函数和
Update 函数 假设有 ScriptA、 ScriptB、 ScriptC
三个脚本 如何确定这三个脚本的执行顺序?
Unity 采用堆栈数据结构管理多个脚本的默认执行顺序
也就是说最先绑定的脚本最后执行 如本页 PPT
所示:我们创建 ScriptA、 ScriptB、 ScriptC 三个脚本
在它们的 Start 函数与 Update 函数中输出相应的信息 最后以
BCA 的顺序将它们添加到场景的游戏对象中
我们以 BCA 的顺序向游戏对象中添加脚本
通过控制台输出可以发现:游戏脚本的执行顺序为 ACB
上述现象表明:Unity 脚本的默认执行顺序为最先绑定的脚本最后执行
通常情况下场景的脚本数量比较多,容易 忘记脚本的设置顺序,Unity
在项目设置中添加了 MonoManager 窗口 用于管理脚本之间的执行顺序。
下面介绍 MonoManager 的打开方式:打开 Edit 菜单,点击 Project Setting
中的 Script Execution Order,即可打开 MonoManager 下面讲解如何使用 MonoManager
管理脚本之间的执行顺序 首先点击右下方的加号按钮添加 Unity
脚本,其次修改脚本的优先级 该值越小,脚本越早执行。
若把脚本的优先级设置为 0,脚本将在 Default Time 执行 该脚本从列表中消失。
最后点击 Apply 按钮,应用设置。
下面 在 MonoManager 中,将脚本的执行顺序改为 CBA
同时仍以 BCA 的顺序将脚本绑定到 场景中的游戏对象,最后点击运行,开始测试。
通过控制台输出 可以发现,脚本的执行顺序与我们在 MonoManager
中设置的执行顺序相同 下面讲解在 MonoManager 中设置 Unity
脚本执行顺序时需要注意 的事项:首先,如果脚本没有在 MonoManager
中设置优先级,表明脚本的优先级为 0 脚本在 Default Time 缺省时间执行。
其次,对优先级相等的脚本 采用默认的执行顺序为:最先设置的脚本最后执行。
最后,优先级只表示脚本执行顺序的前后 并不表示脚本执行时间的延迟,例如优先级
= 100,不表示脚本执行延迟 100 毫秒 在介绍完 Unity
脚本的生命周期后,相信你对 Unity 脚本在项目中的执行方式有了一定的了解
下一节我们对 Project 1:《多米诺骨牌》项目涉及的脚本进行讲解