Синтаксис:
Используется csharp
NetworkManager.Singleton.OnClientConnectedCallback += NetworkManager_Server_OnClientConnectedCallback;
NetworkManager.Singleton.OnClientDisconnectCallback += NetworkManager_Server_OnClientDisconnectCallback;
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
});
}
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);
}
}
}
{
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)
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() у сетевых объектов не работает как обычно? Да и нужно ли это вообще? Уже всю голову сломал (((