Unity学习之常用事件函数Update深度解析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

Unity与常规的程序在逻辑上执行函数是有区别的。常规的程序更像是一个面向对象的过程,一直执行某个循环直到完成某个操作,而Unity常将函数的执行权交给脚本主体。当游戏内发生对应事件时,脚本执行某个函数,执行完毕后执行权转交给Unity。
Unity提供了大量涵盖每个游戏帧的函数,在这个文档中可以查看。

一、常规更新函数

更新函数有

FixedUpdate、Update、LateUpdate

我们首先要理解一下Unity的游戏帧生成的基本时序原理。

游戏对象初始位置 ——> 游戏对象改变位置——> 画面改变画面位置(摄像机)——>渲染新一帧

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函数大多用在摄像机的位置变化上。

猜你喜欢

转载自blog.csdn.net/qq_43592414/article/details/127121622