Network programming 多人移动插值-预测

Network programming 多人移动插值-预测,network-programming,unity3d,multiplayer,Network Programming,Unity3d,Multiplayer,我为插值和移动编写了脚本,但效果不够好,尤其是预测,它只使用对象速度乘以延迟时间(syncVelocity*syncDelay),当玩家停止移动时,会使玩家返回到预测之前的位置。我听说使用unity navmesh类可以改进它,但我不知道如何做到这一点。你知道如何改进剧本吗 链接到文档: 公共类同步:单行为{ 专用浮点lastSynchronizationTime=0f; 专用浮点同步延迟=0f; 专用浮点同步时间=0f; 专用矢量3 syncStartPosition=Vector3.0; 专

我为插值和移动编写了脚本,但效果不够好,尤其是预测,它只使用对象速度乘以延迟时间(syncVelocity*syncDelay),当玩家停止移动时,会使玩家返回到预测之前的位置。我听说使用unity navmesh类可以改进它,但我不知道如何做到这一点。你知道如何改进剧本吗

链接到文档:

公共类同步:单行为{
专用浮点lastSynchronizationTime=0f;
专用浮点同步延迟=0f;
专用浮点同步时间=0f;
专用矢量3 syncStartPosition=Vector3.0;
专用向量3 syncEndPosition=Vector3.0;
//每帧调用一次更新
无效更新(){
如果(!networkView.isMine){
同步移动();
}
}
void OnSerializeNetworkView(比特流、NetworkMessageInfo)
{
Vector3 syncPosition=Vector3.0;
Vector3 syncVelocity=Vector3.0;
if(stream.isWriting)
{
syncPosition=transform.position;
序列化(参考同步位置);
syncVelocity=GetComponent().velocity;
序列化(参考syncVelocity);
}
其他的
{
序列化(参考同步位置);
序列化(参考syncVelocity);
同步时间=0f;
syncDelay=Time.Time-lastSynchronizationTime;
lastSynchronizationTime=Time.Time;
syncStartPosition=transform.position;
syncEndPosition=syncPosition+syncVelocity*syncDelay;
}
}
无效同步移动(){
syncTime+=Time.deltaTime;
transform.position=Vector3.Lerp(syncStartPosition、syncEndPosition、syncTime/syncDelay);
}
}

您所称的“预测”实际上是被调用的。“预测”是。你有什么解决办法吗?
public class Synchronization : MonoBehaviour {

    private float lastSynchronizationTime = 0f;
    private float syncDelay = 0f;
    private float syncTime = 0f;

    private Vector3 syncStartPosition = Vector3.zero;
    private Vector3 syncEndPosition = Vector3.zero;

    // Update is called once per frame
    void Update () {

        if (!networkView.isMine){

            SyncedMovement();

        }
    }

    void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
    {

        Vector3 syncPosition = Vector3.zero;
        Vector3 syncVelocity = Vector3.zero;

        if (stream.isWriting)
        {
            syncPosition = transform.position;
            stream.Serialize(ref syncPosition);

            syncVelocity = GetComponent<CharacterController>().velocity;
            stream.Serialize(ref syncVelocity);
        }
        else
        {
            stream.Serialize(ref syncPosition);

            stream.Serialize(ref syncVelocity);

            syncTime = 0f;
            syncDelay = Time.time - lastSynchronizationTime;
            lastSynchronizationTime = Time.time;

            syncStartPosition = transform.position;
            syncEndPosition = syncPosition + syncVelocity * syncDelay;
        }
    }

    void SyncedMovement(){

        syncTime += Time.deltaTime;
        transform.position = Vector3.Lerp(syncStartPosition, syncEndPosition, syncTime / syncDelay);
    }
}