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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:09