c# - 相机跟随不顺畅

标签 c# unity3d camera 2d

相机应该跟随一个二维角色,这里是代码

void LateUpdate ()
{
    var to = target.position;
    to.z = transform.position.z;
    var newPos = Vector3.Lerp(transform.position, to, speed * Time.deltaTime);
    transform.position = newPos;
    newPos.z = to.z;
    Debug.DrawRay(newPos, Vector3.up, Color.green, 5);
}

我还绘制了角色和相机的位置。

红线是角色的位置,绿线是相机的位置

enter image description here

我做错了什么?

更新:

我发现了一些有趣的东西。在下图中,绿线是在 LateUpdate 方法中由 Vector3.Lerp 移动的相机位置。黄线是我在 FixedUpdate 方法中为角色的 Rigidbody2D 设置的角色位置,红线是从相机的 LateUpdate 内部看到的角色变换的位置。

enter image description here

我想说的是角色的实际位置是由它的Rigidbody2D组件驱动的。通过改变 Rigidbody2D 的“Interpolate”选项,我们可以获得不同的结果。

问题是,即使我在每个 FixedUpdate tick 中向 Rigidbody2D 的位置添加相同的值,结果也不是那么一致。有时新旧位置之间的距离比应有的大。

此外,我们在 LateUpdate 方法中设置了相机的位置,它具有与 FixedUpdate 不同的更新速率,因此即使我们将新位置设置为角色的变换,而不是 Rigidbody2D,相机的移动仍然不会很流畅,因为角色的速度每一帧都会不同。

目前我只有一个解决方案。

  1. 将角色的新位置设置为其变换,而不是 Rigidbody2D
  2. 在 FixedUpdate 中改变相机的位置,而不是在 LateUpdate 中。

然后位置看起来像这样

enter image description here

但是由于相机的位置是在FixedUpdate中设置的,它不会像它可能的那样平滑,而且我不确定角色的碰撞检测是否会正常工作,因为我们直接设置了它的位置对其进行转换。

最佳答案

问题可能出在您如何使用插值来确定将相机移动多远。

我不知道 Vector3.Lerp 的行为是否会在第三个参数(它的分数)高于 1.0 时进行推断,但我怀疑这可能是问题所在(特别是如果帧之间有更多的时间,speed * Time.DeltaTime 变得高于 1.0)

更好的方法(消除 lerp)可能是自己根据速度和时间对距离进行插值;

void LateUpdate ()
{
    var to = target.position;
    to.z = transform.position.z;
    //you can just multiply a Vector3 with a float 
    //so we can do the interpolation maths ourselves like this :
    var distanceToMove = (to - transform.position) * speed * Time.deltaTime; 
    var newPos = transform.position + distanceToMove;
    transform.position = newPos;
    newPos.z = to.z;
    Debug.DrawRay(newPos, Vector3.up, Color.green, 5);
}

(如果这让人感到困惑,这里是清理版本以使其更简洁)

void LateUpdate ()
{
    var to = target.position;
    to.z = transform.position.z;
    transform.position += (to - transform.position) * speed * Time.deltaTime; ;
    Debug.DrawRay(transform.position, Vector3.up, Color.green, 5);
}

关于c# - 相机跟随不顺畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45434210/

相关文章:

C# 和 SWI-Prolog - 将字符列表转换为事实列表

java - 使用前置摄像头但仍然打开闪光灯

c# - Powershell:GetType() 打印所有类型信息,但缺少很多?

c# - Unity3d 5 WavePro 动态网格碰撞器

c# - 方法可以拒绝 Vector2 和 Vector3 的错误类型吗

c# - 带有 Vuforia SDK 的 Unity3d 中 ARCamera 的 Raycast 问题

c++ - gluLookAt 的相机外部矩阵

c# - 更改不透明度时窗口不会重新绘制

c# - 编译器琐事 : What is consequence of this code

c# - 保持 Android 应用程序在后台运行,防止它停止/死亡