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