Awake()和Start区别
Awake() 在 Monobehaviour 创建后立刻被调用,Start()在MonoBehaviour创建后在该帧update前执行。
void Awake()
{
//初始化函数,主要用来创建变量
//不可执行协同程序
}
void Start()
{
}
Awake方法的调用顺序在object之间时随机的,当所有对象的Awake方法都调用完成后,才会执行第一个Start方法,Awake方法就像构造函数一样,Awake方法不论脚本是否启用,都会调用。
Unity中Update和FixUpdate和LateUpdate
FixedUpdate 和 Update
Monobehaviour 激活后,在每一帧被调用,实现更新。
Update 每一帧的时间不固定,即第一帧与第二帧的时间t1和第三帧与第四帧的时间t2不一定相同。FixedUpdate()每帧与每帧之间相差的时间是固定的.
FixUpdate 是按照帧进行更新的。
通常
FixedUpdate()
{
i++;
time += Time.deltaTime;
Debug.Log(“这是第”);
}
MonoBehaviour的 脚本生命周期
1、场景第一次加载时,为场景中每个对象去调用事件函数(初始化)
Awake:实例化对象之后才会调用(非活动状态的对象,只有激活时,才会调用)
OnEnable:(对象处于激活后,才会调用SetActive)
OnLevelWasLoaded:告知游戏已加载新关卡(场景)
2、Editor编辑器模式下
Reset:使用Reset命令初始化脚本属性
3、第一帧更新前(初始化)
Start:当脚本启用实例后,才会在第一帧更新前调用Start
3、更新顺序
游戏逻辑、交互、动画、摄像机位置,使用不同事件函数,绝大多数逻辑在Update
FixedUpdate(物理Physics):固定更新频率,用作于物理渲染。调用此函数之后会执行物理计算和更新,Fixedupdate里计算运动,无需乘以Time.deltaTime,因为已有独立可靠计时器。调用FixedUpdate频率高于Update。
Update:每一帧调用一次Update,帧更新主要函数,执行绝大多数逻辑。
LateUpdate:每一帧在Update调用完毕后,调用LateUpdate。LateUpdate常用用途是跟随第三人称摄像机,保证角色在Update中的移动和旋转,在LateUpdate中执行所有摄像机的移动和旋转计算。确保角色在摄像机跟踪器位置之前已完全移动。
4、协程
Update 函数返回后将运行正常协程更新。协程是一个可暂停执行 (yield) 直到给定的 YieldInstruction 达到完成状态的函数。
协程的不同用法:
- yield 在下一帧上调用所有 Update 函数后,协程将继续。
- yield WaitForSeconds 在为帧调用所有 Update 函数后,在指定的时间延迟后继续协程
- yield WaitForFixedUpdate 在所有脚本上调用所有 FixedUpdate 后继续协程
- yield WWW 在 WWW 下载完成后继续。
- yield StartCoroutine 将协程链接起来,并会等待 MyFunc 协程先完成。
5、销毁对象时
OnDestroy:对象存在的最后一帧完成所有帧更新之后,调用此函数(可能应 Object.Destroy 要求或在场景关闭时销毁该对象)。
6、退出时
在场景中的所有活动对象上调用以下函数:
OnApplicationQuit:在退出应用程序之前在所有游戏对象上调用此函数。在编辑器中,用户停止播放模式时,调用函数。
OnDisable:行为被禁用或处于非活动状态时,调用此函数。
链接: 参考文章1(官方文档)
实战思考
假如现在一个空工程,我创建100个空物体,每个空物体上挂载有空脚本,那么这100个物体的Awake、OnEnable、Start执行顺序是怎样的?
越先创建的,脚本越晚执行
拿4个空物体举例:
拓展思考1:若我把物体调整顺序
- 结果如图,说明与物体排列顺序无关
拓展思考2:若我把其中部分物体作为其他物体的子物体
- 结果如图,说明与父子层级无关
总结
1.在不手动改变其他条件的情况下,物体执行顺序,与物体创建先后有关,后创建的先执行,先创建的后执行;
2.OnEnable在Awake执行后执行,但是在后一个物体执行Awkake之前执行。