Unity Photon房间列表显示异常:后续进入场景无法看到已创房间求助
Unity Photon 房间列表不显示问题排查与解决
问题现象
玩家1创建房间后停留在房间大厅,玩家2启动游戏或从主菜单进入加入房间场景时,无法看到任何已创建的房间;但玩家2已处于加入房间场景中时,玩家1新建房间可立即被看到并加入。尝试过新建Scroll View、按钮预制体、更换多次脚本仍未解决。
相关代码
创建房间代码
public TMP_InputField input_Create; public void CreateRoom() { if (input_Create.text.Length >= 2) // 确保房间名称有效 { PhotonNetwork.CreateRoom(input_Create.text, new RoomOptions() { MaxPlayers = 6, IsVisible = true, IsOpen = true }, TypedLobby.Default, null); } }
获取房间列表脚本
public class RoomList : MonoBehaviourPunCallbacks { public GameObject RoomPrefab; public GameObject[] AllRooms; public override void OnRoomListUpdate(List<RoomInfo> roomList) { // 销毁之前生成的房间UI for (int i = 0; i < AllRooms.Length; i++) { if (AllRooms[i] != null) { Destroy(AllRooms[i]); } } // 初始化房间UI数组 AllRooms = new GameObject[roomList.Count]; // 根据房间列表生成新的UI for (int i = 0; i < roomList.Count; i++) { if (roomList[i].IsOpen && roomList[i].IsVisible && roomList[i].PlayerCount >= 1) { GameObject Room = Instantiate(RoomPrefab, Vector3.zero, Quaternion.identity, GameObject.Find("Content").transform); // 设置房间UI的显示信息 RoomLegacy roomComponent = Room.GetComponent<RoomLegacy>(); roomComponent.Name.text = roomList[i].Name + " (" + roomList[i].PlayerCount + "/" + roomList[i].MaxPlayers + ")"; roomComponent.actualRoomName = roomList[i].Name; // 存储真实房间名称用于后续加入 AllRooms[i] = Room; } } } }
房间按钮加入房间代码
public TMP_Text Name; // 显示房间名称的UI元素 public string actualRoomName; // 存储要加入的真实房间名称 public void JoinRoom() { // 确保客户端已连接并准备好,且处于大厅中 if (PhotonNetwork.IsConnectedAndReady && PhotonNetwork.InLobby) { PhotonNetwork.JoinRoom(actualRoomName); // 使用真实房间名称加入 } else { Debug.LogError("客户端未准备就绪。"); } }
解决方案
1. 进入场景时主动请求房间列表并确保进入大厅
OnRoomListUpdate仅在房间列表发生变化时触发,玩家2刚进入加入房间场景时不会自动获取已存在的房间列表,需主动触发刷新:
修改RoomList脚本,添加以下代码:
void Start() { // 确保客户端已连接并进入大厅 if (PhotonNetwork.IsConnectedAndReady && !PhotonNetwork.InLobby) { PhotonNetwork.JoinLobby(); } // 主动请求房间列表 PhotonNetwork.GetRoomList(); } public override void OnJoinedLobby() { base.OnJoinedLobby(); // 进入大厅后再次刷新列表,确保获取最新数据 PhotonNetwork.GetRoomList(); }
2. 修复房间列表销毁逻辑的空引用问题
原脚本中AllRooms初始为null,第一次调用OnRoomListUpdate时会触发空引用错误,导致列表无法正常生成。修改销毁逻辑:
// 销毁之前生成的房间UI if (AllRooms != null) { for (int i = 0; i < AllRooms.Length; i++) { if (AllRooms[i] != null) { Destroy(AllRooms[i]); } } }
3. 调整房间过滤条件(可选)
原脚本中roomList[i].PlayerCount >= 1会过滤掉无人加入的空房间,如果需要显示空房间,可移除该条件:
if (roomList[i].IsOpen && roomList[i].IsVisible)
4. 确保场景切换时Photon连接状态稳定
检查主菜单到加入房间场景的切换逻辑,确保Photon连接未被意外断开。可在加入房间场景的Start方法中添加连接状态检查:
void Start() { if (!PhotonNetwork.IsConnected) { // 此处填写你的Photon初始化连接代码,例如: // PhotonNetwork.ConnectUsingSettings(); } }
内容的提问来源于stack exchange,提问作者Tejas
相关产品推荐
相关产品推荐

