You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:17:14