Unity Netcode for Gameobjects中如何停止客户端/主机服务?
Unity Netcode 断开连接与单例重复问题解决
1. Stop系列方法不存在的原因
Unity Netcode for GameObjects(NGO)1.0.0及以上正式版本对API做了迭代,原预览版提供的StopHost()、StopClient()、StopServer()方法已被统一移除,替换为通用的Shutdown()方法,不属于缺库问题,也不是框架Bug。Shutdown()方法会自动识别当前NetworkManager的运行身份(主机/客户端/服务端),自动完成对应身份的会话清理、连接断开操作。
2. 跨场景保留NetworkManager的重复实例解决方案
要保留NetworkManager跨场景生效的能力,无需关闭Don't destroy on load属性,按以下逻辑处理即可:
- 游戏场景中放置的NetworkManager对象添加单例校验逻辑,加载时如果已经存在全局单例,直接销毁当前场景新生成的冗余实例:
private void Awake() { if (NetworkManager.Singleton != null && NetworkManager.Singleton != this) { Destroy(gameObject); return; } // 仅首次生成的实例标记为跨场景保留 DontDestroyOnLoad(gameObject); }
- 所有会话启停操作都通过全局
NetworkManager.Singleton单例操作,不要直接操作场景内的实例。
3. 正确的断开连接逻辑示例
public void Disconnect() { if (NetworkManager.Singleton != null && NetworkManager.Singleton.IsListening) { // 主动触发会话停止,清理所有网络连接、同步对象状态 NetworkManager.Singleton.Shutdown(); } // 等待清理完成后再加载主菜单 UnityEngine.SceneManagement.SceneManager.LoadScene("MainMenu"); }
如果有特殊需求需要单独控制断开逻辑,也可以在调用Shutdown()前优先处理自定义的清理操作,再触发框架层的断开逻辑,完全支持主动控制停止时机。
内容的提问来源于stack exchange,提问作者Roy Treves
相关产品推荐
相关产品推荐

