提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
Unity与常规的程序在逻辑上执行函数是有区别的。常规的程序更像是一个面向对象的过程,一直执行某个循环直到完成某个操作,而Unity常将函数的执行权交给脚本主体。当游戏内发生对应事件时,脚本执行某个函数,执行完毕后执行权转交给Unity。
Unity提供了大量涵盖每个游戏帧的函数,在这个文档中可以查看。
一、常规更新函数
更新函数有
FixedUpdate、Update、LateUpdate
我们首先要理解一下Unity的游戏帧生成的基本时序原理。
游戏对象初始位置 ——> 游戏对象改变位置——> 画面改变画面位置(摄像机)——>渲染新一帧
Unity在进行渲染之前首先会让脚本执行游戏对象位置的改变(自动也好用户输入的也罢),在改变之后进行摄像机的位置变化确定画幅中的内容,随后进行渲染。
我们可以看出,首先是Game logic中对游戏对象进行 位置、状态、行为 的更改,随后才是场景的渲染。
这里将介绍第一个函数Update()
Update()
Update函数固定会在帧的更新之前完成执行,在渲染帧之前以及计算动画之前都会调用 Update 函数。
void Update() {
float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");//位置改变的操作
transform.Translate(Vector3.right * distance);
}
Update函数的执行是基于游戏渲染帧的,每秒执行的次数=帧数。这对某些低帧率下的函数是有影响的:
假设一个物体有重力,他是一种环境上的力是物理系统上的力。
这时候你在Update()函数中使用一个大小相同方向相反的力来抵消重力。
你期待的结果是物体保持静止,因为受力平衡。
最终的结果是物体会上下移动,因为画面的帧率不同,Update的执行次数不一,不能时时刻刻抵消或者某一时刻超过了重力。
下面将介绍用于物理系统的Update函数FixedUpdate()
FixedUpdate()
FixedUpdate和Update最大差别是,Update的执行基于画面的渲染帧率,每次渲染都会执行。而FixedUpdate是基于一个离散的内部时钟以固定的时间执行。他是无关于画面帧率的,不会受到帧率影响的。
void FixedUpdate() {
Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical");//物理上的力
rigidbody.AddForce(force);
}
Unity的物理引擎也采用与帧渲染类似的方式以离散时间步骤进行更新。在每次物理更新之前都会调用一个称为 FixedUpdate 的单独事件函数。由于物理更新和帧更新不会以相同频率进行,所以如果将物理代码放在 FixedUpdate 函数而不是 Update 中,此代码将产生更准确的结果。
起码可以让本来受力平衡的物体保持静止QAQ
还有一个比较特殊的Update
LateUpdate()
他总是在Update执行完成之后执行,可以用Update计算完成后的数据进行操作。
为场景中的所有对象调用 Update 和 FixedUpdate 函数之后以及计算所有动画之后,如果能进行其他更改,也会很有用。
void LateUpdate() {
Camera.main.transform.LookAt(target.transform);//摄像机应该聚焦于目标对象
}
在Update函数中将会进行游戏对象位置的更改(例如角色),此时可以在LateUpdate中对摄像机的位置进行更改以达到摄像机时刻追踪目标的效果。
总结
三种Update函数控制着渲染之前的方方面面的操作,总的来说FixedUpdate管理物理系统、Update管理帧渲染前的游戏对象属性变化、LateUpdate函数大多用在摄像机的位置变化上。