为何两个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
相关产品推荐
相关产品推荐

