Unity Netcode重启主机时触发NullReferenceException错误求助
Unity Netcode重启主机时出现NullReferenceException问题
我正在开发一款联机游戏,其余功能正常,但在执行NetworkManager.Shutdown();后调用NetworkManager.StartHost();重启主机开启新游戏时,触发以下错误:
NullReferenceException: Object reference not set to an instance of an object Unity.Netcode.Components.NetworkAnimator.OnClientConnectedCallback (System.UInt64 playerId) (at Library/PackageCache/com.unity.netcode.gameobjects@1.0.0/Components/NetworkAnimator.cs:447) Unity.Netcode.NetworkManager.InvokeOnClientConnectedCallback (System.UInt64 clientId) (at Library/PackageCache/com.unity.netcode.gameobjects@1.0.0/Runtime/Core/NetworkManager.cs:379) Unity.Netcode.NetworkManager.HandleConnectionApproval (System.UInt64 ownerClientId, Unity.Netcode.NetworkManager+ConnectionApprovalResponse response) (at Library/PackageCache/com.unity.netcode.gameobjects@1.0.0/Runtime/Core/NetworkManager.cs:2077) Unity.Netcode.NetworkManager.StartHost () (at Library/PackageCache/com.unity.netcode.gameobjects@1.0.0/Runtime/Core/NetworkManager.cs:1135) Unity.Netcode.Editor.NetworkManagerEditor.OnInspectorGUI () (at Library/PackageCache/com.unity.netcode.gameobjects@1.0.0/Editor/NetworkManagerEditor.cs:321) UnityEditor.UIElements.InspectorElement+<>c__DisplayClass59_0.<CreateIMGUIInspectorFromEditor>b__0 () (at <d2a4066bda954b169ad464ee5a8f02ff>:0) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
已在空场景测试,未出现该问题,推测是自身代码与NetworkManager的交互逻辑存在问题,修改OnNetworkSpawn()函数未解决。
排查与解决建议
- 清理残留的NetworkAnimator实例:错误指向
NetworkAnimator.OnClientConnectedCallback,说明重启时可能存在未被正确销毁的NetworkAnimator对象,导致回调时引用为空。- 检查所有挂载NetworkAnimator的对象,确保Shutdown时通过
NetworkObject.Despawn(true)或Object.Destroy()彻底销毁,而非仅禁用对象。 - 避免给DontDestroyOnLoad标记的对象挂载NetworkAnimator,这类对象在重启时不会自动销毁,易引发残留引用问题。
- 检查所有挂载NetworkAnimator的对象,确保Shutdown时通过
- 确保Shutdown流程完全完成:Shutdown后不要立即调用StartHost,等待网络资源完全释放后再启动主机。可以通过监听事件或帧延迟实现:
private IEnumerator RestartHostCoroutine() { NetworkManager.Singleton.Shutdown(); // 等待服务器和客户端状态完全关闭 yield return new WaitUntil(() => !NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsClient); NetworkManager.Singleton.StartHost(); } - 检查ConnectionApproval逻辑:错误经过
HandleConnectionApproval步骤,确认自定义连接审批代码中是否引用了重启后已销毁的对象(如玩家预制体中的组件),需在重启时重置相关引用。 - 升级Netcode版本:当前使用的1.0.0版本存在部分重启场景的已知bug,尝试升级到稳定的新版本(如1.8.1),可能直接解决问题。
内容的提问来源于stack exchange,提问作者Erfan_Games
相关产品推荐
相关产品推荐

