Photon联机时无法加入已有房间反而重复创建新房间问题
Photon PUN 跨客户端房间不可见/同名房间重复创建问题排查
问题表现
打包后游戏基础功能运行正常,但存在两类异常:
- 第二名玩家通过指定房间名加入房间时,收到「房间不存在」报错
- 使用已存在的房间名再次创建房间,不会触发「房间已存在」报错,会直接创建出全新的同名房间
已核对配置
已排除基础区域配置问题,当前PhotonServerSettings配置如下:
Fixed Region设置为euUse 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; }
注:受篇幅限制未贴出完整脚本,以上为相关核心逻辑片段
根因排查顺序(按出现概率从高到低)
- 核对所有客户端的Realtime AppId一致性
这是该问题最高发的原因:只要两个客户端使用的AppId Realtime字段值不一致,哪怕区域配置完全相同,也会被路由到互相隔离的独立Photon应用实例,实例之间数据不互通,自然会出现搜不到房间、同名房间可重复创建的现象。排查注意点:不要只核对编辑器下当前平台的配置,要确认打包时对应目标平台(Android/Windows/iOS等)的配置分组下AppId完全一致,避免多平台配置分组不一致导致的问题。
- 检查是否存在代码动态覆写Photon配置的逻辑
全局搜索工程内所有和Photon初始化相关的代码,确认没有在调用ConnectUsingSettings()前动态修改PhotonNetwork.NetworkingClient.AppId、PhotonNetwork.NetworkingClient.AppVersion、PhotonNetwork.OverrideBestCloudServer这类字段/方法的逻辑,尤其排查挂载在较早执行生命周期([RuntimeInitializeOnLoadMethod]、Awake、Start)的脚本,避免代码逻辑覆盖面板上的手动配置。 - 确认创建/加入房间的调用时机正确
所有创建、加入房间的接口,必须在客户端收到OnConnectedToMaster回调之后再调用。如果客户端还没完成和主服务器的连接就调用创建/加入接口,PUN会本地缓存请求待重连后执行,此时如果客户端因为网络波动重连到其他实例,就会出现房间隔离。
可以在OnConnectedToMaster回调中加开关拦截所有房间操作,未收到回调时所有创建/加入按钮置灰不可点击,从流程上避免时序问题。 - 显式指定创建/加入房间的大厅参数
当前创建/加入代码没有显式传入大厅参数,依赖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); } - 运行时打印关键参数对比
如果以上排查都没定位到问题,可以在OnConnectedToMaster回调里打印四个关键参数,两个客户端连接成功后对比参数值,存在差异的项就是问题根源:
额外注意:public override void OnConnectedToMaster() { Debug.Log($"Photon连接信息:AppId={PhotonNetwork.AppId}, 区域={PhotonNetwork.CloudRegion}, 服务器地址={PhotonNetwork.ServerAddress}, 版本={PhotonNetwork.AppVersion}"); // 原有逻辑 }PhotonNetwork.AppVersion字段如果两个客户端不一致,也会触发同区域下的房间隔离,记得一并核对。
内容的提问来源于stack exchange,提问作者Rodolf
相关产品推荐
相关产品推荐

