Unity Netcode:点击窗口X时NetworkManager立即触发断开回调,如何阻止或延迟?
解决Unity中NetworkManager提前断开与退出确认冲突的问题
问题核心
你设置的Application.wantsToQuit退出确认逻辑,无法阻止NetworkManager在点击窗口关闭按钮时立即触发断开回调——这是因为多数网络框架(比如Netcode for GameObjects)默认会监听应用生命周期的早期事件,或者直接绑定了原生窗口关闭事件,触发时机早于wantsToQuit的确认流程。
解决方案
1. 禁用NetworkManager的自动断开行为
首先找到NetworkManager的配置选项(不同框架略有差异):
- Netcode for GameObjects:在Inspector面板中取消勾选
Auto Shutdown选项,禁止它在应用关闭时自动执行断开操作。 - Mirror框架:将
NetworkServer.ShutdownOnExit设为false,或者在NetworkManager的设置中关闭自动退出相关选项。
如果没有可视化配置,可通过代码禁用自动断开的事件注册(以Netcode为例):
private void Awake() { if (NetworkManager.Singleton != null) { // 移除默认的自动断开回调 NetworkManager.Singleton.OnApplicationQuit -= NetworkManager.Singleton.Shutdown; } }
2. 修改退出逻辑,手动控制断开时机
把网络断开操作移到确认退出后的流程中,确保只有用户点击“是”时才执行断开:
修改后的完整代码:
private bool quitConfirmed = false; private void OnEnable() => Application.wantsToQuit += QuitConfirmBox; private void OnDisable() => Application.wantsToQuit -= QuitConfirmBox; public void Quit() /* 点击确认退出按钮时调用 */ { // 先执行网络断开 if (NetworkManager.Singleton != null) { // 如果是客户端,先主动断开连接 if (NetworkManager.Singleton.IsClient) NetworkManager.Singleton.ShutdownClient(); // 关闭服务器/网络管理器 NetworkManager.Singleton.Shutdown(); } quitConfirmed = true; Application.Quit(); } private bool QuitConfirmBox() { uiManager.ConfirmQuitMessageBox(); return quitConfirmed; } // 移除原OnApplicationQuit中的自动断开逻辑
3. 关键原理
强制把网络断开的控制权收回到你的退出确认流程中,避免NetworkManager的默认自动行为绕过你的确认逻辑,确保只有用户明确确认退出后,才执行网络断开和应用退出操作。
内容的提问来源于stack exchange,提问作者sketch1e
相关产品推荐
相关产品推荐

