Photon如何检测房主已开启房间并让新加入玩家直接进入对局而非大厅
实现对局进行中新玩家自动进入对局的方案
前提配置
首先开启Photon的场景自动同步,这是最简实现的核心,只要开启该参数,房主切换场景时,所有房间内玩家(包括后续新加入的玩家)都会自动同步加载房主当前的场景,无需手动写RPC调用加载。
在游戏初始化逻辑(如大厅管理脚本的Start方法)中添加:
PhotonNetwork.AutomaticallySyncScene = true;
步骤1:房主启动游戏时标记房间状态
通过Photon的房间自定义属性存储游戏是否已启动的标记,修改你现有的GameRPC方法:
[PunRPC] public void Game(string name) { // 构造自定义属性,标记游戏已启动 ExitGames.Client.Photon.Hashtable gameStateProp = new ExitGames.Client.Photon.Hashtable(); gameStateProp.Add("IsGameStarted", true); PhotonNetwork.CurrentRoom.SetCustomProperties(gameStateProp); PhotonNetwork.LoadLevel(name); }
注意:创建房间时可以将IsGameStarted属性初始化为false,避免读取时出现空值异常
步骤2:新玩家加入房间后判断状态
你不需要修改现有JoinRoom的逻辑,只需要监听加入房间成功的系统回调即可。首先确保你的脚本继承自MonoBehaviourPunCallbacks,然后添加回调实现:
// 加入房间成功后自动触发 public override void OnJoinedRoom() { // 读取房间的游戏启动标记,默认值为false兼容属性未初始化的情况 bool isGameStarted = false; if (PhotonNetwork.CurrentRoom.CustomProperties.TryGetValue("IsGameStarted", out object value)) { isGameStarted = (bool)value; } if (isGameStarted) { // 已开启场景自动同步的情况下,Photon会自动加载房主当前的对局场景,无需额外操作 // 你可以在这里添加进入对局前的前置逻辑,比如加载玩家数据等 } else { // 游戏未启动,停留在大厅/房间等待页面即可 } }
可选优化
如果你需要在大厅列表中展示房间是否已开局,可以在创建房间时配置RoomOptions,将IsGameStarted属性设为大厅可见:
RoomOptions roomOptions = new RoomOptions(); roomOptions.CustomRoomPropertiesForLobby = new string[] { "IsGameStarted" }; // 其余创建房间的逻辑不变
内容的提问来源于stack exchange,提问作者Everton Figueiredo
相关产品推荐
相关产品推荐

