我正在使用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);
}
}
}
答案 0 :(得分:0)
因此,我不确定在您的客户端是否通过Unity物理引擎处理事情,这就是您没有遇到通过客户端看到的混蛋的原因;但是,您可以在某种程度上考虑您的服务器以运动方式处理所有内容,因为它似乎只是覆盖了播放器的位置并尝试线性插入到下一个位置。
这不是我要采取的方法,但如果您这样做,我会建议您将更新功能更改为FixedUpdate:
void FixedUpdate() {
ListLerp();
}
如果你这样做,我相信你甚至不需要线性插值,只需将播放器的位置更改为数据包发送的Vector,只要你的客户端 - 服务器连接与你的数据包发送一样好在任何时间点,玩家的位置都不应该有很大的差异。