结论:
FixedUpdate频率固定更新,通常更新物理逻辑
Update每帧更新,通常更新输入
LateUpdate是在所有更新种类的最后更新
尽量少用Update,不然顺序不好掌控。而更新实在无法掌控的时候,用Script Excution Order
一般情况下,抖动来源是您对Update的用法。
在很久很久以前,网上一般说角色的移动用FixedUpdate,也可以用Update,但是移动要乘以Time.deltaTime。于是我的游戏《彩虹之岛:冒险的开始》一开始使用FixedUpdate监听输入来让角色移动。一开始都还对,但是我发现有20%左右的几率按跳跃跳不起来。然后我就全部用Update,里面乘以Time.deltaTime来保证移动是流畅的。当然相机是放在LateUpdate里面,保证相机在所有位移计算结束后计算相机的位置,保证了相机拍摄的东西都是在正确的地方。
而我的第一个在steam发售的3DARPG作品《绿野白银树》也是使用了同样的方法,只不过角色的位移交给了动画去控制,角色也成为了不会跳的不死人开始传火,代码基本没有管物理了。但我后来发现,没有垂直同步的状态下,在Update里乘了Time.deltaTime的值会变小。可能是unity的Bug,但这导致了物理运动在Update里乘以Time.deltaTime的做法应该不是正确的做法。
所以我的新作2D横版RPG《绿野玩具城》就遇见了全新的问题。
这个图我使用update输入左右控制角色(乘以了Time.deltaTime的),虚拟摄像机跟随角色移动,大脑摄像机跟随虚拟摄像机移动,背景跟随大脑摄像机移动,背景发生抖动(感觉角色都在抖)。我思考过改成3D的,背景就放在很远的地方就好了。但是这样就不能用cinemachine的边缘限制等功能了。我要用cinemachine!
我经过研究后作出了如下修改:
我最后还是继续使用正交摄像机方便使用cinemachine各种功能
对角色操作长按类按键放FixedUpdate,触发类按键放Update
大脑摄像机用SmartUpdate(我暂时不知道这是什么玩意儿,看名字应该是比较聪明的亚子)
背景计算用LateUpdate
但是这样还是会抖动,按照原理应该需要把背景计算确实地放在摄像机的聪明更新之后,但是那个代码我们是看不见的,只好使用Script Excution Order,把背景计算放在最后,就行了!