平滑地浏览vector3的列表

时间:2018-05-24 17:07:14

标签: c# unity3d

我正在使用GameLift,所以我不认为我可以使用Unity的网络工具,因此我正在编写自己的NetworkTransform组件。这是有效的,当我移动角色在服务器上移动时在客户端上。

在当前只是模仿客户端的服务器上,播放器移动得有点不稳定。当我在列表中移动时,如何平滑我的lerp?它看起来好像是从一个列表项到另一个列表项时的生涩部分。

private List<Vector3> syncPosList = new List<Vector3>();

public float interpolationFactor = 18;
public float interpolationFactorFaster = 25;

public void OnNetworkMessage(Vector3 v3) {
  syncPosList.Add(v3);
}

void Update() {
  ListLerp();
}

void ListLerp() {
  if (syncPosList.Count > 0) {
    var speed = syncPosList.Count > 1 ? interpolationFactorFaster : interpolationFactor;
    transform.position = Vector3.Lerp(transform.position, syncPosList[0], Time.deltaTime * interpolationFactor);
    if (Vector3.Distance(transform.position, syncPosList[0]) < 0.1f) {
      syncPosList.RemoveAt(0);
    }
  }
}

Movement

1 个答案:

答案 0 :(得分:0)

因此,我不确定在您的客户端是否通过Unity物理引擎处理事情,这就是您没有遇到通过客户端看到的混蛋的原因;但是,您可以在某种程度上考虑您的服务器以运动方式处理所有内容,因为它似乎只是覆盖了播放器的位置并尝试线性插入到下一个位置。

这不是我要采取的方法,但如果您这样做,我会建议您将更新功能更改为FixedUpdate:

void FixedUpdate() {
    ListLerp();
}

如果你这样做,我相信你甚至不需要线性插值,只需将播放器的位置更改为数据包发送的Vector,只要你的客户端 - 服务器连接与你的数据包发送一样好在任何时间点,玩家的位置都不应该有很大的差异。