相机跟不顺利

时间:2017-08-01 09:36:51

标签: c# unity3d camera 2d

相机应该遵循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移动的Camera的位置。黄线是我在FixedUpdate方法中设置为角色的Rigidbody2D的角色的位置,红线是角色变换的位置,就像他们从相机的LateUpdate内部看到的那样。

enter image description here

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

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

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

现在我只有一个解决方案。

  1. 将角色的新位置设置为其变换,而不是Rigidbody2D
  2. 更改其在FixedUpdate中的位置,而不是在LateUpdate中。
  3. 然后这些职位将是这样的

    enter image description here

    但是由于摄像机的位置是在FixedUpdate中设置的,它不会那么平滑,而且我也不确定角色的碰撞检测是否能正常工作,因为我们直接设置它的位置改变它。

1 个答案:

答案 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);
}