Переключение между объектами игрока в Unity Networking

c# unity3d unity5

530 просмотра

1 ответ

9 Репутация автора

Я хотел бы знать, как я могу переключаться между управляемыми объектами в сети Unity.

Например, скажем, есть два объекта, Player1 и Player2, и вы контролируете Player1. Нажав пробел, вы теперь управляете Player2. Нажмите снова, чтобы вернуться к управлению Player1.

Что я сделал: я следовал «Руководству по Unity» вплоть до «Test Multiplayer Movement», и, ссылаясь на «Переключение игроков» в объектах Player,
я изменил сценарий Player следующим образом:

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 (Prefab) в иерархию.

Ошибка: я попытался воспроизвести его, и при переключении на Player2 с Player1 работает, переключение обратно на Player1 с Player2 не. Сообщение об ошибке идет:

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)
Автор: Tsunehiko Shimadu Источник Размещён: 18.07.2016 03:06

Ответы (1)


0 плюса

4171 Репутация автора

Для использования сетевого объекта вам необходимо сначала назначить полномочия для его использования.

Предположим, если вы находитесь на player1 и хотите переключиться на player2,

Назначьте полномочия для player2 и удалите полномочия для player1 (и наоборот для другого переключателя).

Для назначения полномочий вы должны использовать этот AssignClientAuthority . Для практической реализации кода я рекомендую вам это обсуждение на форуме единства (стоит понять).

Автор: Muhammad Faizan Khan Размещён: 07.02.2017 07:36
32x32