目标:两个玩家都可以互动的对象,并且其位置和旋转都已同步(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;
}
}
尝试失败:
以上所有内容经过多次构建后都没有结果,
如果修复方法很简单,例如从服务器生成对象-所有玩家都拥有所有权,谁能指导我?
如果还有更简便的方法(不需要更好的方法/最佳实践),请告诉我。
答案 0 :(得分:0)
尝试一下:
if (isServer)
{
RpcSyncPosRot(transform.localPosition, transform.localRotation);
}
else
{
CmdSyncPosRot(transform.localPosition, transform.localRotation);
}
答案 1 :(得分:0)
生成测试立方体时未添加所有者:
araster
这将同步播放器1输入而非播放器2的旋转和位置。