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

Unity Mirror Networking:场景切换后OnServerSceneChanged回调未调用

解决Unity Netcode中OnServerSceneChanged回调未触发的问题

针对你遇到的场景切换成功但OnServerSceneChanged未触发的问题,以下是具体的排查和修复方案:

1. 检查NetworkManager核心设置

确保NetworkManager Inspector面板的Scene Management模块中,Allow Scene Management选项处于勾选状态。该选项是Netcode触发场景相关回调的前提,未开启时OnServerSceneChanged不会被调用。

2. 修正玩家对象替换逻辑

你的ServerChangeScene方法中手动销毁旧玩家对象的操作会干扰Netcode的内部状态,导致后续回调异常。NetworkServer.ReplacePlayerForConnection会自动处理旧玩家对象的销毁,无需手动调用NetworkServer.Destroy。修改后的代码如下:

public override void ServerChangeScene(string newSceneName)
{
    if (SceneManager.GetActiveScene().path == menuScene && newSceneName.Contains("Game"))
    {
        for (int i = RoomPlayers.Count - 1; i >= 0; i--)
        {
            var conn = RoomPlayers[i].connectionToClient;
            var gameplayerInstance = Instantiate(gamePlayerPrefab);
            gameplayerInstance.SetDisplayName(RoomPlayers[i].DisplayName);

            // 移除手动销毁代码,由ReplacePlayerForConnection自动处理旧对象
            // NetworkServer.Destroy(conn.identity.gameObject);

            NetworkServer.ReplacePlayerForConnection(conn, gameplayerInstance.gameObject);
        }
    }
    base.ServerChangeScene(newSceneName);
}

3. 验证场景名称匹配性

确认调用ServerChangeScene("Game")时传入的场景名称,与Build Settings中添加的场景名称完全一致(大小写敏感)。名称不匹配会导致Netcode无法正确识别场景切换完成,进而跳过回调。

4. 确认重写方法签名正确性

检查OnServerSceneChanged的签名是否完全匹配基类定义:

public override void OnServerSceneChanged(string sceneName)

注意方法名、参数类型和访问修饰符必须严格一致,否则无法被Netcode正确触发。

内容的提问来源于stack exchange,提问作者koogel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:51:11