Unity-Technologies / com.unity.netcode.gameobjects

Netcode for GameObjects is a high-level netcode SDK that provides networking capabilities to GameObject/MonoBehaviour workflows within Unity and sits on top of underlying transport layer.
MIT License
2.1k stars 430 forks source link

NullReferenceException during client Shutdown #2879

Open Risord opened 2 months ago

Risord commented 2 months ago

Description

I use heavily custom messages and time to time client shutdown crashes. Don't have reproduce steps but concept is pretty simple:

// At Unity.Netcode.NetworkManager.ShutdownInternal()

            ...
            CustomMessagingManager = null;  // <= !!!

            RpcTarget?.Dispose();
            RpcTarget = null;

            BehaviourUpdater?.Shutdown();
            BehaviourUpdater = null;

            // Shutdown connection manager last which shuts down transport
            ConnectionManager.Shutdown();  // <= !!!
            ...

Problems is that ConnectionManager.Shutdown() does execute received messages and deep in stack there is UnnamedMessage.Handle which access NetworkManager.CustomMessagingManager => bhoom.

On surface level it seems that NetworkManager.CustomMessagingManager should be nullified after ConnectionManager.Shutdown();. I tried that and so far things seems to work well but my knowledge from library internals are limited.

Environment

Additional Context

Complete stacktrace:

NullReferenceException: Object reference not set to an instance of an object
Unity.Netcode.UnnamedMessage.Handle (Unity.Netcode.NetworkContext& context) (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Messaging/Messages/UnnamedMessage.cs:23)
Unity.Netcode.NetworkMessageManager.ReceiveMessage[T] (Unity.Netcode.FastBufferReader reader, Unity.Netcode.NetworkContext& context, Unity.Netcode.NetworkMessageManager manager) (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Messaging/NetworkMessageManager.cs:582)
Unity.Netcode.NetworkMessageManager.HandleMessage (Unity.Netcode.NetworkMessageHeader& header, Unity.Netcode.FastBufferReader reader, System.UInt64 senderId, System.Single timestamp, System.Int32 serializedHeaderSize) (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Messaging/NetworkMessageManager.cs:446)
UnityEngine.Debug:LogException(Exception)
Unity.Netcode.NetworkMessageManager:HandleMessage(NetworkMessageHeader&, FastBufferReader, UInt64, Single, Int32) (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Messaging/NetworkMessageManager.cs:450)
Unity.Netcode.NetworkMessageManager:ProcessIncomingMessageQueue() (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Messaging/NetworkMessageManager.cs:472)
Unity.Netcode.NetworkConnectionManager:DisconnectEventHandler(UInt64) (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Connection/NetworkConnectionManager.cs:492)
Unity.Netcode.NetworkConnectionManager:HandleNetworkEvent(NetworkEvent, UInt64, ArraySegment`1, Single) (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Connection/NetworkConnectionManager.cs:394)
Unity.Netcode.NetworkTransport:InvokeOnTransportEvent(NetworkEvent, UInt64, ArraySegment`1, Single) (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Transports/NetworkTransport.cs:49)
Unity.Netcode.Transports.UTP.UnityTransport:DisconnectLocalClient() (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Transports/UTP/UnityTransport.cs:1154)
Unity.Netcode.NetworkConnectionManager:Shutdown() (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Connection/NetworkConnectionManager.cs:1145)
Unity.Netcode.NetworkManager:ShutdownInternal() (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Core/NetworkManager.cs:1166)
Unity.Netcode.NetworkManager:NetworkUpdate(NetworkUpdateStage) (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Core/NetworkManager.cs:84)
Unity.Netcode.NetworkUpdateLoop:RunNetworkUpdateStage(NetworkUpdateStage) (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Core/NetworkUpdateLoop.cs:185)
Unity.Netcode.<>c:<CreateLoopSystem>b__0_0() (at ./Packages/com.unity.netcode.gameobjects@1.8.1/Runtime/Core/NetworkUpdateLoop.cs:268)