Unity / Mirror网络没有客户端同步

问题描述

目标:两个玩家都可以互动的对象,并且其位置和旋转都已同步(LAN)。

场景设置:类似于镜像中的pong示例的简单场景,当生成两个玩家时,会生成一个多维数据集,两个玩家都可以通过同步进行交互。

测试立方体-在具有网络标识/网络转换的网络管理器中注册为可生成的预制体,并在两个玩家都加入并在按下“ z”或“ x”时移动它的简单旋转脚本将其生成

public Transform LeftPlayerSpawn;
public Transform RightPlayertSpawn;
GameObject Testcube;

public override void OnServerAddplayer(NetworkConnection conn)
{
    Transform start = numPlayers == 0 ? LeftPlayerSpawn : RightPlayertSpawn;
    GameObject player = Instantiate(playerPrefab,start.position,start.rotation);
    NetworkServer.AddplayerForConnection(conn,player);

    if (numPlayers == 2)
    {
        Testcube = Instantiate(spawnPrefabs.Find(prefab => prefab.name == "TestCube"));
        NetworkServer.Spawn(Testcube);
    }
}

问题:对服务器所做的任何更改都会反映在客户端中,并且本地播放器可以控制对象,但无法与其他客户端同步。 Video of No-Sync

问题:Networktransform组件中的bool-客户端权限的目的是什么?当具有权限的客户端移动特定转换时,它应该自动同步该特定转换还是允许用户通过脚本手动同步?

来自Mirror docs-“认情况下,除非您选中“客户端授权”复选框,否则网络转换是服务器权威的。客户端授权适用于播放器对象以及专门分配给客户端的非播放器对象,但仅启用此功能后,位置更改将从客户端发送到服务器”。

还尝试通过附加在测试多维数据集上的SyncPosRot脚本通过[Command] / [CientRpc]更新位置和旋转,

void Update()
{
    if (isLocalPlayer) 
    {
        CmdsyncPosRot(transform.localPosition,transform.localRotation);
    } 
}

[Command]
void CmdsyncPosRot(Vector3 localPosition,Quaternion localRotation)
{
    RpcSyncPosRot(localPosition,localRotation);
}

[ClientRpc]
void RpcSyncPosRot(Vector3 localPosition,Quaternion localRotation)
{
    if (!isLocalPlayer) 
    {
        transform.localPosition = localPosition;
        transform.localRotation = localRotation;
    }
}

尝试失败:

  1. 尝试使用和不使用SyncPosRot脚本,
  2. 尝试和不使用网络转换组件中的bool-client权限
  3. 将网络标识/网络转换移动到检查器的顶部和底部,因为这似乎可以解决具有类似问题的其他人(对我而言不是)的同步,

以上所有内容经过多次构建后都没有结果,

如果修复方法很简单,例如从服务器生成对象-所有玩家都拥有所有权,谁能指导我?

如果还有更简便的方法(不需要更好的方法/最佳实践),请告诉我。

解决方法

尝试一下:

if (isServer)
{
    RpcSyncPosRot(transform.localPosition,transform.localRotation);
}
else
{
    CmdSyncPosRot(transform.localPosition,transform.localRotation);
}
,

生成测试立方体时未添加所有者:

araster

这将同步播放器1输入而非播放器2的旋转和位置。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...