由于 Time.deltaTime,C#/Unity 相机跟随抖动

Posted

技术标签:

【中文标题】由于 Time.deltaTime,C#/Unity 相机跟随抖动【英文标题】:C#/Unity Camera Follow Jitter due to Time.deltaTime 【发布时间】:2021-04-15 08:32:07 【问题描述】:

游戏:在一个用 Unity 制作的简单 2D 肖像游戏中,我有一个游戏对象(玩家),它有一个固定的位置并且正在向上移动。摄像机跟随玩家,动画障碍物不时从左向右移动。附加的Screenshot 显示了场景。

问题: 运动并不顺畅,因为播放器似乎在抖动。我想我已经确定了其中一个原因:Time.deltaTime 的巨大变化。平均值是 0.0167,但我有变化。最小值为 0.00177,最大值为 0.2249519。

设置: 目标帧率为 60。我使用 Unity 2019.4.2f1 并作为构建目标使用 ios 14.2 的 iPhone X。

脚本

public class Player: MonoBehaviour 
 
    float speed = 5f; 
    void Update() 
     
        transform.Translate(0,speed*Time.deltaTime,0); 
     
 

public class CamFollow : MonoBehaviour 
 
    public Transform Player; 
    private Vector3 FollowVector; 
    void LateUpdate() 
     
        FollowVector = Player.position - new Vector3(0, -4.0f, 10); 
        transform.position = Vector3.Lerp(transform.position, FollowVector, Time.deltaTime * 4f); 
     
 

注意:我需要使用Lerp,因为播放器可能会降低或增加速度一秒钟,然后相机会轻轻移动到新位置,然后再变回来。对于障碍,我没有脚本。他们正在移动,通过使用动画组件。对于障碍物,我只循环改变位置的 x 值。

我的替代解决方案:

1.将 Time.deltaTime 的值更改为常数值 0.01666667f:

void Update() 
 
    transform.Translate(0,speed*0.01666667f,0); 
 

这使得播放器对象在 Unity 编辑器中抖动很多,但在设备上只有一点点

2。对相机跟随和玩家移动使用固定更新

这使得运动和相机跟随完美流畅,但动画对象抖动很多。我知道 Unity 希望在下一次更新中解决 deltaTime 问题。但是我的问题应该有解决方案,所以有人有类似的问题,可以解决吗?我更喜欢第二种选择,因为动作看起来非常流畅和漂亮,所以我可以让动画成为“fixedUpdate”的一部分吗?

【问题讨论】:

【参考方案1】:

“deltaTime”的变化是意料之中的。

PC 上的差异很大,因为您在一台复杂的计算机上运行,​​该计算机具有复杂的操作系统和许多其他应用程序同时运行,每个应用程序都有大量线程,它们每隔一段时间都想做一些工作。因此,操作系统的调度程序无法保证您将在您想要的精确时刻获得时间片以渲染下一帧。

移动设备上的变化更小,因为它是一台更简单的机器,执行的操作更少,因此调度程序能够为您提供接近您所要求的精确间隔的时间片。

当你这样做时,你已经考虑到了这种变化

transform.Translate( 0, speed * Time.deltaTime, 0 ); 

这是游戏开发中的一项基本技术:帧速率永远不会恒定,因此您必须在每一帧上移动对象的距离取决于这一帧和前一帧之间经过的精确时间量。

所以,那部分很好。

你的问题出在

transform.position = Vector3.Lerp( transform.position, FollowVector, Time.deltaTime * 4f );

在这里,您将 Time.deltaTime * 4f 传递给 Vector3.Lerp() 的参数 t。我不知道您要完成什么,但是您需要传递的数字需要在 0 和 1 之间逐渐过渡,而是传递随机变化的秒数乘以某个魔术常数 4。这看起来不正确。

我能想到的几个选项:

始终将0.5 用于t,这样摄像头总是会冲到正确的位置,然后在靠近它时减速。 为相机计算一个单独的速度矢量,然后像对播放器一样使用平移来移动相机。

【讨论】:

谢谢,使用 t 的常数我得到了更流畅的运动。你能解释一下为相机使用单独的速度矢量是什么意思吗?那会怎样,我为什么需要它? 另外,是否有可能获得“FixedUpdate”解决方案,因为所有物理运动都应该在那里处理?因为即使运动更顺畅,我仍然会跳跃 你可以把摄像机想象成另一个跟随你的玩家的玩家,只不过它不是玩家,而是摄像机。我实际上对 Unity 的了解还不够,无法提供有关 FixedUpdate 的建议。

以上是关于由于 Time.deltaTime,C#/Unity 相机跟随抖动的主要内容,如果未能解决你的问题,请参考以下文章

你啥时候乘以 Unity 中的 Time.deltaTime?

你啥时候乘以 Unity 中的 Time.deltaTime?

Unity 为 Time.DeltaTime 创建局部变量以进行数学计算

关于Unity中Time.deltaTime的使用

Unity中Time.deltaTime的含义及其应用

csharp Time.deltaTime移动