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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:42:04