Почему у ведущего игрока нет полномочий отправлять серверу [команду]? Единство - Зеркало - PullRequest
1 голос
/ 18 июня 2020

Я делаю пошаговую многопользовательскую игру с Unity 2019.3.2f1 и использую Mirror для подключения игроков. Моя цель - добавить объекты игроков в сценарий GameMaster (как вы увидите в моем самом нижнем сценарии), чтобы я мог отслеживать их и обновлять их прогресс в сценарии Player. Я следил за учебником DapperDino на YouTube (https://www.youtube.com/watch?v=oBRt9OifJvE&list=PLS6sInD7ThM1aUDj8lZrF4b4lpvejB2uB&index=2) и создал лобби, скопировав все из учебника, кроме системы генерации, и внес изменения в имена сцен, удалил обработчик карты и вместо этого просто есть 2 сцены. После того, как 2 игрока войдут в лобби, нажмите «Готово», а хост - «Старт», сцена MainMenu изменится на GameScene и начнется фактическая игра, но перед этим вызывается функция NetworkServer.ReplacePlayerForConnection(conn, gameplayerInstance.gameObject), перед изменением сцены. И я получаю эту ошибку:

RemoveClientAuthority может вызываться только на сервере для порожденных объектов. UnityEngine.Logger: Log (LogType, Object) Mirror.ILoggerExtensions: LogError (ILogger, Object) (в Assets / Mirror / Runtime / LogFactory.cs: 58) Mirror.NetworkIdentity: RemoveClientAuthority () (в Assets / Mirror / Runtime / NetworkIdentity .cs: ​​1230) Mirror.NetworkServer: InternalReplacePlayerForConnection (NetworkConnection, GameObject, Boolean) (в Assets / Mirror / Runtime / NetworkServer.cs: 843) Mirror.NetworkServer: ReplacePlayerForConnection (NetworkConnection, GameObject, Boolean) (Mirror / Assets / Assets / Assets / Assets / Assets / Assets / Assets / /NetworkServer.cs:680) DapperDino.Mirror.Tutorials.Lobby.NetworkManagerLobby: ServerChangeScene (String) (в Assets / Lobby / Scripts / NetworkManagerLobby.cs: 181) DapperDino.Mirror.Tutorials.Lobby.NetworkManagerLobby (atLobby.NetworkManagerLobby): Assets / Lobby / Scripts / NetworkManagerLobby.cs: 163)

Почему следует вызывать RemoveClientAuthority ()?

Тогда я получаю следующее предупреждение: Попытка отправить команду для объекта без полномочий. Player.CmdAddPlayer

Вот мой код. Как видите, при обновлении я проверяю, есть ли (! HasAuthority), и если клиент этого не делает, я бы вернул функцию обновления, но этого никогда не было, поэтому я прокомментировал ее для отладки. Я получаю предупреждение о хост-процессе, что сбивает меня с толку. Разве хост не должен иметь полномочий, поскольку он также является сервером?

using System.Collections.Generic;
using UnityEngine;
using Mirror;


public class Player : NetworkBehaviour
{
    GameMaster gameMaster=null;
    //public NetworkManager networkManager;

    public Country country;
    public List<Territory> controlledTerritories;
    public List<Army> armies = new List<Army>();
    public int gold;
    bool set = false;
    void Start()
    {
        //networkManager = GameObject.FindWithTag("NetworkManager").GetComponent<NetworkManager>();
    }
    [Client]
    void Update()
    {
        //Debug.Log(networkManager);
        if (!set)
        {
            if (!hasAuthority)
            {
                //return;
            }
            Debug.Log("About to call CmdAddPlayer()");
            //This is the furthest I get. I get the warning after trying to call CmdAddPlayer() and it isn't called
            CmdAddPlayer();
        }
    }
    [Command]
    void CmdAddPlayer()
    {
        //Validate logic here
        Debug.Log("Called CmdAddPlayer()");
        RpcAddPlayer();
    }

    [ClientRpc]
    void RpcAddPlayer()
    {
        Debug.Log("Called RpcPlayer()");
        GameObject _mapTmp = GameObject.FindWithTag("GameController");
        GameMaster _gameMasterTmp = null;
        if (_mapTmp != null)
        {
            _gameMasterTmp = _mapTmp.GetComponent<GameMaster>();
        }
        if (gameMaster == null && _gameMasterTmp != null)
        {
            gameMaster = _gameMasterTmp;
            gameMaster.players.Add(this);
            set = true;
        }
    }
}

1 Ответ

1 голос
/ 20 июня 2020

Я следую тому же руководству и наткнулся на ту же ошибку.

По-видимому, это как-то связано с ServerChangeScene от Mirror.

Вы можете решить эту проблему довольно легко. В сценарии DapperDino NetworkManagerLobby, go переопределите ServerChangeScene и получите идентификатор уничтожения, чтобы он шел от этого:

NetworkServer.Destroy(conn.identity.gameObject);     
NetworkServer.ReplacePlayerForConnection(conn, gameplayerInstance.gameObject); 
 

, чтобы он был изменен на:

 NetworkServer.ReplacePlayerForConnection(conn, gameplayerInstance.gameObject); 
 

Это должно исправить это. Кажется, что объект игрока в комнате уничтожается автоматически.

Вы можете узнать больше об ошибке здесь, если это не сработает: https://github.com/vis2k/Mirror/issues/1593

Чтобы ответить на вторую половину проблемы, есть хорошее объяснение:

Unity3D. Попытка отправить команду для объекта без полномочий

В принципе, вы можете пытаться отправить команду от объекта, у которого нет полномочий. Итак, что это значит?

Вы можете отправить команду только от ВАШЕГО объекта игрока К объекту игрока, который представляет ВАС на другом компьютере.

Это не ясно из вашего кода, но вы может быть:

  1. ЛИБО попытка отправить команду от объекта 'player', принадлежащего другому игроку (например, если вы перебираете всех игроков в игре).
  2. ИЛИ вы написали скрипт под названием 'player', которому не были предоставлены права (я подозреваю, что это тот, который вы назвали свой объект 'player', а не 'NetworkGamePlayer', как в учебнике.

Если вы пытаетесь сделать первый, убедитесь, что вы проверили, является ли игрок локальным игроком:

    void CallCommandMove(){
       if(!isLocalPlayer){
        return;
         }
       CmdMove();
    }

В качестве альтернативы, если вы пытаетесь сделать второй , вам необходимо предоставить свои собственные права доступа к объекту игрока (как в принятом ответе в этой ветке: Unity3D. Попытка отправить команду для объекта без прав доступа

Наконец, самый простой подход пока Обучение - это просто поместить свой код в скрипт NetworkGamePlayer.

...