在Unity Networking中切换玩家对象

本文关键字:玩家 对象 Unity Networking | 更新日期: 2023-09-27 17:57:25

我想知道如何在Unity的网络中在可控对象之间来回切换。

例如,假设有两个对象,Player1和Player2,并且您正在控制Player1。通过按空格键,您现在可以控制Player2。再次按下,返回控制Player1。

我所做的:我遵循《统一手册》直到"测试多人游戏移动",并参考了玩家对象中的"切换玩家"
我将播放器的脚本更改为如下:

using UnityEngine;
using UnityEngine.Networking;
public class PlayerMove : NetworkBehaviour {
    string player1;
    string player2;
    void Start(){
        player1 = "Player1(Clone)";
        player2 = "Player2";
    }
    // Update is called once per frame
    void Update () {
        if(!isLocalPlayer){
            return;
        }

        float x = Input.GetAxis("Horizontal")*0.1f;
        float z = Input.GetAxis("Vertical")*0.1f;
        transform.Translate(x, 0, z);
        if(Input.GetKeyDown(KeyCode.Space)){
            Debug.Log("switched");
            PlayerChange(this.gameObject);
        }
    }
  public void PlayerChange(GameObject oldPlayer)
  {
      var conn = oldPlayer.GetComponent<NetworkIdentity>().connectionToClient;
      GameObject newPlayer;
      if(this.gameObject.name == player1){
          newPlayer = GameObject.Find(player2);
          NetworkServer.ReplacePlayerForConnection(conn, newPlayer, 0);
      }
      else{
          newPlayer = GameObject.Find(player1); 
          NetworkServer.ReplacePlayerForConnection(conn, newPlayer, 0);
      }  
  }
}

此外,Player2对象是通过将Player1(预设)拖动到"层次"来创建的。

错误:我试着播放它,虽然从Player1切换到Player2有效,但从Player2切换回Player1无效。错误信息为:

SetClientOwner m_ClientAuthorityOwner already set!
UnityEngine.Networking.NetworkServer:ReplacePlayerForConnection(NetworkConnection, GameObject, Int16)
PlayerMove:PlayerChange(GameObject) (at Assets/PlayerMove.cs:43)
PlayerMove:Update() (at Assets/PlayerMove.cs:28)

在Unity Networking中切换玩家对象

对于使用网络对象,您应该首先分配权限才能使用它。

假设你在player1,想要切换到player2,那么

将权限分配给player2并从player1中删除权限(对于另一个交换机,反之亦然)。

对于分配权限,您应该使用此AssignClientAuthority。对于代码的实际实现,我将向您推荐本次团结论坛讨论(值得理解)。