微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

统一同步玩家位置镜像

如何解决统一同步玩家位置镜像

目标:在使用镜像网络 API 的 Unity 多人游戏中同步玩家位置

问题:

  1. 使用 NetworkTransform 组件,位置似乎没有精确同步,客户端和服务器都看到玩家处于错误的位置,玩家往往会无缘无故地飞起来

  2. 我尝试制作一个单独的脚本:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;

public class PlayerSyncronization : NetworkBehavIoUr
{
    [SyncVar]
    public Vector3 syncPosition;
    [SyncVar]
    public Quaternion syncRotation;

    public float lerpRate = 15;

    private void FixedUpdate()
    {
        TransmitPosition();
        Lerp();
    }
    void Lerp()
    {
        if (!hasAuthority) return;
        transform.position = Vector3.Lerp(transform.position,syncPosition,Time.deltaTime * lerpRate);
        transform.rotation = Quaternion.Lerp(transform.rotation,syncRotation,Time.deltaTime * lerpRate);
    }

    [ClientCallback]
    void TransmitPosition()
    {
        CmdProvidePositionToServer(transform.position,transform.rotation);
    }

    [Command]
    void CmdProvidePositionToServer(Vector3 pos,Quaternion rot)
    {
        syncPosition = pos;
        syncRotation = rot;
    }
}

但是结果和网络变换组件是一样的,即使一个玩家停止行走,在另一侧他也会一直走,直到他从地图上掉下来

这些是我在使用脚本时遇到的错误/警告

信息:

  • 玩家移动是客户端,因为我使用的是根运动。
  • 我无法使用 IsLocalPlayer,因为它仅在玩家由 Networkmanger 直接生成并且我的玩家由单独的脚本生成时才有效。
  • 现在,即使我不使用它,我的 PlayerPrefab 中也有一个 CharacterController
  • 我正在使用 Steamworks 让玩家通过互联网连接

如果需要更多信息,请告诉我。

解决方法

我知道问题出在我使用的角色控制器上,所以在玩家脚本中我检查了玩家是否有权限,如果没有,我销毁角色控制器,如果我在服务器上销毁它,我将其替换为一个没有物理的普通对撞机,所以我仍然可以有碰撞

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。