Ошибка при отключении хоста в Netcode for Gameobjects

Общие вопросы о Unity3D

Ошибка при отключении хоста в Netcode for Gameobjects

Сообщение skroliks 13 янв 2024, 10:36

Делаю сетевую игру используя Netcode for Gameobjects в Unity. Есть основной сетевой менеджер, наследуемый от NetworkBehaviour и в нем мы подписываемся на события подключения и отключения клиентов от созданного нами хоста:

Синтаксис:
Используется csharp
    NetworkManager.Singleton.OnClientConnectedCallback += NetworkManager_Server_OnClientConnectedCallback;
    NetworkManager.Singleton.OnClientDisconnectCallback += NetworkManager_Server_OnClientDisconnectCallback;



При подключении клиента мы заносим его данные в сетевую переменную (список):

Синтаксис:
Используется csharp
        private NetworkList<PlayerData> playerDataNetworkList;
        playerDataNetworkList = new();
   
    private void NetworkManager_Server_OnClientConnectedCallback(ulong clientId)
    {
        playerDataNetworkList.Add(new PlayerData{
        clientId = clientId
        });
    }


А когда клиент отключается мы удаляем его из этого списка:

Синтаксис:
Используется csharp
    private void NetworkManager_Server_OnClientDisconnectCallback(ulong clientId)
    {
        for(int i = 0; i < playerDataNetworkList.Count; i++){
            PlayerData playerData = playerDataNetworkList[i];
            if(playerData.clientId == clientId){
                //Disconnected
                playerDataNetworkList.RemoveAt(i);
            }
        }
    }


Так вот, если мы создаем сетевую игру как хост и отключаемся - то никаких ошибок не возникает, так же не возникает ошибок, если подключаются или отключаются клиенты.. ОДНАКО - если кроме нас к нашей игре присоединился хотя бы один игрок и мы после этого отключаемся, выскакивает все время ошибка:

Синтаксис:
Используется csharp
    NullReferenceException: Object reference not set to an instance of an object
    Unity.Netcode.NetworkList`1[T].MarkNetworkObjectDirty () (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/NetworkVariable/Collections/NetworkList.cs:78)
    Unity.Netcode.NetworkList`1[T].HandleAddListEvent (Unity.Netcode.NetworkListEvent`1[T] listEvent) (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/NetworkVariable/Collections/NetworkList.cs:536)
    Unity.Netcode.NetworkList`1[T].RemoveAt (System.Int32 index) (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/NetworkVariable/Collections/NetworkList.cs:503)
    NetworkGameManager.NetworkManager_Server_OnClientDisconnectCallback (System.UInt64 clientId) (at Assets/Scripts/Multiplayer/NetworkGameManager.cs:186)
    Unity.Netcode.NetworkConnectionManager.OnClientDisconnectFromServer (System.UInt64 clientId) (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/Connection/NetworkConnectionManager.cs:850)
    UnityEngine.Debug:LogException(Exception)
    Unity.Netcode.NetworkConnectionManager:OnClientDisconnectFromServer(UInt64) (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/Connection/NetworkConnectionManager.cs:854)
    Unity.Netcode.NetworkConnectionManager:DisconnectRemoteClient(UInt64) (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/Connection/NetworkConnectionManager.cs:877)
    Unity.Netcode.NetworkConnectionManager:Shutdown() (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/Connection/NetworkConnectionManager.cs:976)
    Unity.Netcode.NetworkManager:ShutdownInternal() (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/Core/NetworkManager.cs:980)
    Unity.Netcode.NetworkManager:OnDestroy() (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/Core/NetworkManager.cs:1046)
    Unity.Netcode.NetworkManager:OnApplicationQuit() (at Library/PackageCache/com.unity.netcode.gameobjects@1.6.0/Runtime/Core/NetworkManager.cs:1040)


Вылетает она именно при попытке удалить игрока из списка при отключении:

Синтаксис:
Используется csharp
    playerDataNetworkList.RemoveAt(i);


Однако, как избавится от нее - я так и не нашел решения. Пробовал проверять на наличие .NetworkManager.Singleton что он не равен null, либо же что сам список не равен null перед удалением - но через дебаг показывает, что все есть.. Но ошибка при этом тоже. Что делать? Подскажите, кто сталкивался с подобным?

Была идея, что надо отписываться от **NetworkManager.Singleton.OnClientDisconnectCallback -= NetworkManager_Server_OnClientDisconnectCallback;** при отключении, но как это сделать, если стандартный OnDestroy() у сетевых объектов не работает как обычно? Да и нужно ли это вообще? Уже всю голову сломал (((
skroliks
UNIт
 
Сообщения: 60
Зарегистрирован: 10 сен 2022, 13:30

Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10