相机应该遵循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);
}
我还绘制角色和相机的位置。
红线是角色的位置,绿线是相机的位置
我做错了什么?
更新
我发现了一些有趣的东西。在下面的图片中,绿线是在LateUpdate方法中由Vector3.Lerp移动的Camera的位置。黄线是我在FixedUpdate方法中设置为角色的Rigidbody2D的角色的位置,红线是角色变换的位置,就像他们从相机的LateUpdate内部看到的那样。
我想说的是角色的实际位置是由其Rigidbody2D组件驱动的。通过更改Rigidbody2D的“Interpolate”选项,我们可以获得不同的结果。
问题是,即使我在每个FixedUpdate tick中添加Rigidbody2D的位置相同的值,结果也不是那么一致。有时新旧位置之间的距离应该比应有的大。
除此之外,我们在LateUpdate方法中设置了摄像机的位置,它具有与FixedUpdate不同的更新速率,所以即使我们将新位置设置为角色的变换,而不是Rigidbody2D,也就是相机的移动仍然不会很流畅,因为角色的速度每一帧都会不同。
现在我只有一个解决方案。
答案 0 :(得分:1)
问题可能来自于如何使用插值来确定移动相机的距离。
如果第三个参数(其分数)高于1.0,我不知道Vector3.Lerp
的行为是否会推断,但我怀疑这可能是问题(特别是如果帧之间有更多的时间,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);
}