0

在我的多人浏览器游戏中,当我的玩家使用相机后,我看到相机卡顿。玩家位置是从服务器接收到的,玩家会移动到那个位置,我的目标是让相机通过自己的额外平滑平滑地跟随玩家。

您可以在http://orn.io找到我的游戏以查看当前状态,没有平滑跟随相机 lerping,这更好,但会导致运动不稳定并让人头疼。相机的当前代码如下:

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 而抖动。

如果有人能提出一种改进相机的方法,我将不胜感激,因为它现在的代码。

4

1 回答 1

1

您需要使用 Mathf.Lerp 函数有什么特别的原因吗?

Unity 有一个函数Vector3.SmoothDamp是专门为运动 lerping 设计的:

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

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

您还可以调整阻尼时间以更改过渡的平滑程度。此功能还将自动考虑玩家的移动 mid-lerp。

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

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

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

于 2017-04-13T04:00:54.203 回答