Я следую тому же руководству и наткнулся на ту же ошибку.
По-видимому, это как-то связано с 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. Попытка отправить команду для объекта без полномочий
В принципе, вы можете пытаться отправить команду от объекта, у которого нет полномочий. Итак, что это значит?
Вы можете отправить команду только от ВАШЕГО объекта игрока К объекту игрока, который представляет ВАС на другом компьютере.
Это не ясно из вашего кода, но вы может быть:
- ЛИБО попытка отправить команду от объекта 'player', принадлежащего другому игроку (например, если вы перебираете всех игроков в игре).
- ИЛИ вы написали скрипт под названием 'player', которому не были предоставлены права (я подозреваю, что это тот, который вы назвали свой объект 'player', а не 'NetworkGamePlayer', как в учебнике.
Если вы пытаетесь сделать первый, убедитесь, что вы проверили, является ли игрок локальным игроком:
void CallCommandMove(){
if(!isLocalPlayer){
return;
}
CmdMove();
}
В качестве альтернативы, если вы пытаетесь сделать второй , вам необходимо предоставить свои собственные права доступа к объекту игрока (как в принятом ответе в этой ветке: Unity3D. Попытка отправить команду для объекта без прав доступа
Наконец, самый простой подход пока Обучение - это просто поместить свой код в скрипт NetworkGamePlayer.