【问题标题】:Unity Netcode: Change Ownership doesn't work for meUnity Netcode:更改所有权对我不起作用
【发布时间】:2022-10-30 16:49:45
【问题描述】:

我一直在尝试使用这个在服务器中生成游戏对象(特别是玩家游戏对象)player.GetComponent().Spawn()然后试图改变所有权。它对我不起作用。如此沮丧。任何人都可以帮助解决这个问题。

我想在服务器和客户端生成两个不同的播放器。因此,我尝试仅在服务器中生成所有玩家,并尝试使用 ownerclientId、LocalClientId 更改所有权。没有任何效果。发生的情况是它在服务器和客户端屏幕中都生成了两个玩家,但只有服务器拥有所有权。

代码sn-p:

private void Start()
    {
        var playerSelected = GameObject.Find("PlayerSelected");
        int selectedPlayer = playerSelected.GetComponent<PlayerSelected>().selectPlayer;
        if (NetworkManager.Singleton.IsServer)
        {
            PlayerSpawner(selectedPlayer, OwnerClientId);
        }
        else
        {
            PlayerSpawnerOnServerRpc(selectedPlayer, OwnerClientId);
        }
    }

    [ServerRpc(RequireOwnership = false)]
    void PlayerSpawnerOnServerRpc(int selectedPlayer, ulong clientId)
    {
        PlayerSpawner(selectedPlayer, clientId);
    }

    void PlayerSpawner(int selectedPlayer, ulong clientId)
    {
         GameObject player;
         switch(selectedPlayer)
         {
             case 0:
                    player = Instantiate(player1Prefab, spawnPositionPlayer1);
                    player.GetComponent<NetworkObject>().Spawn();
                    player.GetComponent<NetworkObject>().ChangeOwnership(clientId);
                    break;
             case 1:
                    player = Instantiate(player2Prefab, spawnPositionPlayer2);
                    player.GetComponent<NetworkObject>().Spawn();
                    player.GetComponent<NetworkObject>().ChangeOwnership(clientId);
                    break;
         }
    }

【问题讨论】:

    标签: unity3d multiplayer unity-networking


    【解决方案1】:

    这不起作用的原因是服务器正在快速连续发送两条消息。

    player.GetComponent<NetworkObject>().Spawn();
    player.GetComponent<NetworkObject>().ChangeOwnership(clientId);
    

    第一个告诉客户端生成一个对象。第二个赋予对象所有权。您不能保证(即使在本地运行)Spawn() 在调用 ChangeOwnership() 时已经完成。所以当ChangeOwnership() 被调用时,客户端可能还没有完成初始化生成的对象。

    Unity 意识到了这一点,并为您提供了SpawnWithOwnership (docs)。用一个替换你的两行:

    player.GetComponent<NetworkObject>().SpawnWithOwnership(clientId);
    

    【讨论】:

      猜你喜欢
      • 2022-10-02
      • 2020-11-15
      • 1970-01-01
      • 2020-04-22
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多