统一联网。 transform.setparent() 在客户端不工作

Unity networking. transform.setparent() not working on a clinet side

我正在用 Unity 编写一个简单的多人棋盘游戏。

我遇到以下问题:transport.setparent() 无法在客户端运行。 当我将游戏作为服务器启动时,一切正常。当我作为客户端连接到服务器时 transform.setParent() 什么都不做。

这是我的代码:

public GameObject PlayerPrefab;

private GameObject player;

// Use this for initialization
void Start () {
    if (!isLocalPlayer)
    {
        return;
    }
    Debug.Log("Spawning.");
    CmdSpawn();
}


[Command]
void CmdSpawn()
{
    player = Instantiate(PlayerPrefab);
    NetworkServer.SpawnWithClientAuthority(player, connectionToClient);
    player.transform.SetParent(GameObject.Find("BoardPanel").transform, false);
}

我找到了答案。这是我的解决方案: 步骤 1) 使用 SyncVar 在服务器和客户端之间同步父对象的 netID。 步骤 2) 当对象在客户端上生成时,使用同步的 netID 找到父对象并将其设置为转换的父对象。

[Command]
void CmdSpawn()
{
    Debug.Log("Spawning.");
    player = Instantiate(PlayerPrefab);
    player.GetComponent<Player>().ParentNetId = this.netId;
    NetworkServer.SpawnWithClientAuthority(player, connectionToClient);
}

并且需要在播放器脚本中添加此代码:

[SyncVar]
public NetworkInstanceId ParentNetId;

public override void OnStartClient()
{
    Debug.Log("OnStartClient.");
    transform.SetParent(GameObject.Find("BoardPanel").transform, false);
}

使用它来查找父对象:- 转换 parentTransform = PhotonView.Find(parentid).gameObject.transform;

然后像这样调用rpc在客户端创建父对象:- this.GetComponent().RPC("RPC_DropObject", RpcTarget.AllBuffered, 位置, 旋转, hasParent, parent.gameObject.GetComponent().ViewID);