相机跟随物体有点不对(它颤抖,抽搐)如何顺利完成?

时间:2018-01-20 08:59:01

标签: c# unity3d

我使用LookAt(目标)功能:

public class cub : MonoBehaviour {
    public float range = 5f, moveSpeed = 30f, turnSpeed = 150f;
    public Transform target;

    void Update(){
        if (Input.GetKey(KeyCode.UpArrow))
            transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
        if (Input.GetKey(KeyCode.DownArrow))
            transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime);
        if (Input.GetKey(KeyCode.LeftArrow))
            transform.Rotate(Vector3.up * -turnSpeed * Time.deltaTime);
        if (Input.GetKey(KeyCode.RightArrow))
            transform.Rotate(Vector3.up * turnSpeed * Time.deltaTime);
    }
}

public class cubeCamera : MonoBehaviour {
    public Transform target; 
	void Update () {
        transform.LookAt(target);
        transform.position = new Vector3(target.position.x, target.position.y + 6, target.position.z - 25);
	}
}

我从位置幼崽改变了摄像机的位置,我认为这是不对的。比如说,我需要绝对顺利地跟踪对象

1 个答案:

答案 0 :(得分:2)

transform.position = new Vector3(target.position.x, target.position.y + 6, target.position.z - 25);

是问题的根源。在这里,每次更新都会移动对象固定数量的单位,似乎依赖于每秒60次更新。 "抽搐"(也称为抖动)是由于可变帧率。现代硬件上的游戏不能以60fps的速度运行(一帧可能是59,另一帧可能是61,等等)。帧率会根据游戏和系统的其他部分的不同而波动很大。

它看起来像这样:

  • 16.667ms
  • 19ms
  • 25ms的
  • 16.667ms
  • 时间18ms
  • 19ms

在足够的帧数超过16.667ms(~60fps)后,您会注意到抽搐/抖动。解决方案是使更改框架独立。最简单的方法是将单位(在您的情况下为6和25)乘以Time.deltaTime。这会将您的计算从单位/帧更改为单位/秒,与帧速率无关。