Исключение Unity Mirror Networking InvalidCastException: Указанное приведение недопустимо

#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, она устраняет все проблемы и работает потрясающе!