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

为何两个GameObject预制体同时成为Master Client?求助

问题排查与解决方案

核心问题分析

场景切换后双端均成为Master Client,大概率是场景加载未通过Photon的同步机制完成,导致客户端各自独立初始化,破坏了房间的Master Client选举逻辑。

分步解决方案

1. 确保场景加载使用Photon同步模式

  • 调用PhotonNetwork.LoadLevel()前,必须先开启房间的自动场景同步:
    // 创建/加入房间时开启自动同步场景
    RoomOptions roomOptions = new RoomOptions();
    roomOptions.AutoSyncScene = true;
    PhotonNetwork.JoinOrCreateRoom("RoomName", roomOptions, TypedLobby.Default);
    
  • 只有Master Client有权调用PhotonNetwork.LoadLevel(),非Master Client不要触发该方法,否则会导致双端各自加载场景,状态混乱。

2. 修正场景加载后的Master Client校验逻辑

在场景加载完成的回调中(比如OnSceneLoaded),强制校验并修正Master Client状态:

public void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
    if (PhotonNetwork.InRoom)
    {
        // 获取房间内首个加入的玩家(理论上应为原始Master Client)
        Player firstPlayer = PhotonNetwork.PlayerList.OrderBy(p => p.ActorNumber).First();
        if (!PhotonNetwork.IsMasterClient && PhotonNetwork.LocalPlayer != firstPlayer)
        {
            // 强制设置首个玩家为Master Client
            PhotonNetwork.SetMasterClient(firstPlayer);
        }
    }
}

注意:注册OnSceneLoaded回调要在MonoBehaviour的Start()中执行:

void Start()
{
    SceneManager.sceneLoaded += OnSceneLoaded;
}

3. 排查自定义逻辑对Master Client状态的干扰

  • 检查是否有代码在场景加载后错误地调用了PhotonNetwork.SetMasterClient给本地玩家,导致覆盖了正确的Master Client。
  • 确保所有涉及Master Client权限的操作(比如生成对象、执行控制台命令)都先通过PhotonNetwork.IsMasterClient判断,避免非Master Client执行越权操作。

4. 验证Photon Network初始化配置

  • 确认PhotonServerSettings中的AutoSyncScene已勾选,或者在代码中动态设置房间的AutoSyncScene为true。
  • 检查客户端连接到的是同一个Photon服务器区域,避免跨区域导致的房间状态不同步。

额外注意事项

  • 场景切换时,非Master Client会自动跟随Master Client加载场景,无需手动调用LoadLevel。
  • 如果使用PhotonNetwork.LoadLevelAsync,同样要确保只有Master Client触发,且依赖AutoSyncScene同步到其他客户端。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:54:57