波普的相机运动,顺畅跟随

时间:2017-04-13 03:12:25

标签: c# unity3d unity5 lerp

在我的多人游戏浏览器游戏中用我的相机播放我的播放器之后使用平滑跟随lerp时,我看到一个相机口吃。从服务器接收玩家位置,玩家到达该位置,我的目标是让摄像机顺利跟随玩家自己的额外平滑。

你可以在http://orn.io找到我的游戏,看看目前的状态,没有顺利跟随相机,这更好,但会导致波动,并造成头痛。相机跟随的当前代码是:

void LateUpdate ()
{
    if (Target == null) {
        return;
    }

    currentScale = Mathf.Lerp(currentScale, -GameManager.TotalMass, Mathf.Clamp01 (Time.deltaTime * heightDamping));

    Vector3 h = currentScale * 2f * Target.up;
    Vector3 f = currentScale * 3f * Target.forward;

    // tried lerping to this value but it causes choppy stutters
    Vector3 wantedPosition = new Vector3(Target.position.x, Target.position.y, currentScale * 2) + h + f;

    myTransform.position = wantedPosition;

    myTransform.LookAt (Target, -Vector3.forward); // world up
}

我已经尝试了几天来修补这些值,使用固定时间戳,将相机移动放在FixedUpdate / Update中,使用MoveTowards和其他更改,但我仍然遇到问题。

我的问题部分是玩家位置在lerp中间变化,这会导致口吃因为目标位置在lerp中间发生变化。由于lerp的目标位置在lerp中间发生变化,因此会导致相机跳转/切换,并因LookAt而抖动。

我很感激,如果有人能提出一种改进相机的方法,那就像现在的代码一样。

1 个答案:

答案 0 :(得分:1)

您是否有任何特殊原因需要使用Mathf.Lerp功能?

Unity有一个功能,Vector3.SmoothDamp专门用于移动运动:

void FixedUpdate() {
   // Code for your desired position
   transform.position = Vector3.SmoothDamp(transform.position, wantedPosition, ref moveVelocity, dampTime);     
}

上面将通过给出SmoothDamp方法控制速度变量来平滑地跟随玩家。这假设你为它提供了一个ref来存储当前的速度和潮湿的时间。

您还可以调整潮湿时间以更改过渡的平滑程度。此功能还会自动解释玩家在lerp中的移动。

为了澄清,引用文档,上面的dampTime是:

  

大约达到目标所需的时间。较小的值将更快地达到目标。

还可以考虑使用Quaternion.slerp在两次旋转之间平滑旋转。