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

Photon联机时无法加入已有房间反而重复创建新房间问题

Photon PUN 跨客户端房间不可见/同名房间重复创建问题排查

问题表现

打包后游戏基础功能运行正常,但存在两类异常:

  • 第二名玩家通过指定房间名加入房间时,收到「房间不存在」报错
  • 使用已存在的房间名再次创建房间,不会触发「房间已存在」报错,会直接创建出全新的同名房间

已核对配置

已排除基础区域配置问题,当前PhotonServerSettings配置如下:

  • Fixed Region 设置为 eu
  • Use Name Server 选项已勾选
  • Dev Region 留空为null
  • 构建设置中 development build 设为false
    附创建/加入房间核心逻辑代码:
public void CreateRoom()
{
    if (string.IsNullOrEmpty(CreateInputField.text))
    {
        return;
    }
    PhotonNetwork.CreateRoom(CreateInputField.text);
}
public void JoinRoom()
{
    if (string.IsNullOrEmpty(JoinInputField.text))
    {
        return;
    }
    PhotonNetwork.JoinRoom(JoinInputField.text);
}
public override void OnJoinedRoom()
{
    PhotonNetwork.LoadLevel("Game");
}

public override void OnCreateRoomFailed(short returnCode, string message)
{
    failText.text = message;
}
public override void OnJoinRoomFailed(short returnCode, string message)
{
    failText.text = message;
}

注:受篇幅限制未贴出完整脚本,以上为相关核心逻辑片段


根因排查顺序(按出现概率从高到低)

  1. 核对所有客户端的Realtime AppId一致性
    这是该问题最高发的原因:只要两个客户端使用的AppId Realtime字段值不一致,哪怕区域配置完全相同,也会被路由到互相隔离的独立Photon应用实例,实例之间数据不互通,自然会出现搜不到房间、同名房间可重复创建的现象。

    排查注意点:不要只核对编辑器下当前平台的配置,要确认打包时对应目标平台(Android/Windows/iOS等)的配置分组下AppId完全一致,避免多平台配置分组不一致导致的问题。

  2. 检查是否存在代码动态覆写Photon配置的逻辑
    全局搜索工程内所有和Photon初始化相关的代码,确认没有在调用ConnectUsingSettings()前动态修改PhotonNetwork.NetworkingClient.AppId、PhotonNetwork.NetworkingClient.AppVersion、PhotonNetwork.OverrideBestCloudServer这类字段/方法的逻辑,尤其排查挂载在较早执行生命周期([RuntimeInitializeOnLoadMethod]、Awake、Start)的脚本,避免代码逻辑覆盖面板上的手动配置。
  3. 确认创建/加入房间的调用时机正确
    所有创建、加入房间的接口,必须在客户端收到OnConnectedToMaster回调之后再调用。如果客户端还没完成和主服务器的连接就调用创建/加入接口,PUN会本地缓存请求待重连后执行,此时如果客户端因为网络波动重连到其他实例,就会出现房间隔离。
    可以在OnConnectedToMaster回调中加开关拦截所有房间操作,未收到回调时所有创建/加入按钮置灰不可点击,从流程上避免时序问题。
  4. 显式指定创建/加入房间的大厅参数
    当前创建/加入代码没有显式传入大厅参数,依赖PUN的默认大厅配置,如果不同客户端因为插件版本差异、本地配置缓存导致默认大厅不一致,也会出现房间在不同大厅隔离的问题。修改代码显式指定默认大厅即可:
    public void CreateRoom()
    {
        if (string.IsNullOrEmpty(CreateInputField.text))
        {
            return;
        }
        RoomOptions roomOptions = new RoomOptions()
        {
            MaxPlayers = 4, // 按自身业务需求设置
            IsOpen = true,
            IsVisible = true
        };
        // 显式指定使用默认大厅
        PhotonNetwork.CreateRoom(CreateInputField.text, roomOptions, TypedLobby.Default);
    }
    
    public void JoinRoom()
    {
        if (string.IsNullOrEmpty(JoinInputField.text))
        {
            return;
        }
        // 加入时同样指定默认大厅,和创建逻辑对齐
        PhotonNetwork.JoinRoom(JoinInputField.text, null, TypedLobby.Default);
    }
    
  5. 运行时打印关键参数对比
    如果以上排查都没定位到问题,可以在OnConnectedToMaster回调里打印四个关键参数,两个客户端连接成功后对比参数值,存在差异的项就是问题根源:
    public override void OnConnectedToMaster()
    {
        Debug.Log($"Photon连接信息:AppId={PhotonNetwork.AppId}, 区域={PhotonNetwork.CloudRegion}, 服务器地址={PhotonNetwork.ServerAddress}, 版本={PhotonNetwork.AppVersion}");
        // 原有逻辑
    }
    
    额外注意:PhotonNetwork.AppVersion字段如果两个客户端不一致,也会触发同区域下的房间隔离,记得一并核对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:12:47