#c# #unity3d #multiplayer
Вопрос:
Я пытался создать пользовательский порождающий плеер, но постоянно сталкивался с
«Указанное приведение недопустимо
попытался поискать его в Интернете, но все результаты были бесполезны, так что надеюсь, что кто-нибудь здесь сможет мне помочь.
Проблемная линия:
NetworkServer.AddPlayerForConnection(conn, playerobject);
….это если произошла ошибка. (Полная ошибка ниже)
Код:
public override void OnClientConnect(NetworkConnection conn)
{
var connection = conn;
connlist.Add(connection);
if (!clientLoadedScene)
{
if (!NetworkClient.ready) NetworkClient.Ready();
{
GameObject playerobject = (GameObject)Instantiate(Player, new Vector3(0, 0, 0), new Quaternion(0, 0, 0, 0));
playerobject.GetComponent<PlayerManager>().PlayerName = nameplayer;
NetworkServer.AddPlayerForConnection(conn, playerobject);
Debug.Log(nameplayer " is spawned!");
}
}
base.OnClientConnect(conn);
}
Ошибка Полная:
Исключение InvalidCastException: Указанное приведение недопустимо. Зеркало.Сетевая идентичность.SetClientOwner (Зеркало.Соединение с сетью) (в активах/Зеркале/Во время выполнения/NetworkIdentity.cs:250) Зеркало.Сетевой сервер.AddPlayerForConnection (Зеркало.Подключение к сети, UnityEngine.Игрок игрового объекта) (в активах/Зеркале/Во время выполнения/сетевом сервере.cs:617) NetManager.OnClientConnect (Зеркало.Соединение с сетью) (в разделе Активы/Скрипты/NetManager.cs:58) Зеркало.Сетевой менеджер.OnClientAuthenticated (Зеркало.Соединение с сетью) (в разделе Активы/Зеркало/Среда выполнения/NetworkManager.cs:1158) Зеркало.Сетевой менеджер.OnClientConnectInternal () (в разделе Активы/Зеркало/Среда выполнения/NetworkManager.cs:1142) Зеркало.LocalConnectionToServer.Обновление () (в активах/Зеркале/Во время выполнения/LocalConnections.cs:84) Зеркальное отображение.Сетевой клиент.NetworkLateUpdate () (в разделе Активы/Зеркало/Среда выполнения/NetworkClient.cs:1249) Зеркало.NetworkLoop.NetworkLateUpdate () (в активах/Зеркале/Во время выполнения/NetworkLoop.cs:189)
Ответ №1:
Я не совсем уверен, в какой строке вы получаете ошибку, но из того, что я помню Instantiate()
, метод возвращает a GameObject
, поэтому вам не нужно будет его приводить, кроме того, вы не должны хранить свое соединение var
в списке, если вы намерены сохранить его, ваш пересмотренный код должен быть примерно таким:
public override void OnClientConnect(NetworkConnection conn)
{
connlist.Add(conn);
if (!clientLoadedScene)
{
if (!NetworkClient.ready) NetworkClient.Ready();
{
var playerobject = Instantiate(Player, new Vector3(0, 0, 0), new Quaternion(0, 0, 0, 0));
playerobject.GetComponent<PlayerManager>().PlayerName = nameplayer;
NetworkServer.AddPlayerForConnection(conn, playerobject);
Debug.Log(nameplayer " is spawned!");
}
}
base.OnClientConnect(conn);
}
Комментарии:
1. Да, это было сразу после того, как я получил ошибку, я много пытался, я еще не удалил ее, но проблема в подключении AddPlayerForConnection
Ответ №2:
Я нашел решение, я переместил свой код порождения в функцию, которая является OnServerAddPlayer вместо OnClientConnect, она устраняет все проблемы и работает потрясающе!