相机应该跟随一个二维角色,这里是代码
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);
}
我还绘制了角色和相机的位置。
红线是角色的位置,绿线是相机的位置
我做错了什么?
更新:
我发现了一些有趣的东西。在下图中,绿线是在 LateUpdate 方法中由 Vector3.Lerp 移动的相机位置。黄线是我在 FixedUpdate 方法中为角色的 Rigidbody2D 设置的角色位置,红线是从相机的 LateUpdate 内部看到的角色变换的位置。
我想说的是角色的实际位置是由它的Rigidbody2D组件驱动的。通过改变 Rigidbody2D 的“Interpolate”选项,我们可以获得不同的结果。
问题是,即使我在每个 FixedUpdate tick 中向 Rigidbody2D 的位置添加相同的值,结果也不是那么一致。有时新旧位置之间的距离比应有的大。
此外,我们在 LateUpdate 方法中设置了相机的位置,它具有与 FixedUpdate 不同的更新速率,因此即使我们将新位置设置为角色的变换,而不是 Rigidbody2D,相机的移动仍然不会很流畅,因为角色的速度每一帧都会不同。
目前我只有一个解决方案。
- 将角色的新位置设置为其变换,而不是 Rigidbody2D
- 在 FixedUpdate 中改变相机的位置,而不是在 LateUpdate 中。
然后位置看起来像这样
但是由于相机的位置是在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/