Photon笔记一:获取并显示房间列表

获取并显示房间列表:(不保证是最新sdk可用)

别人的教程都是用GetRoomList()方法,但是PUN2里面这个方法去掉了,改用

public override void OnRoomListUpdate(List roomList)

这个方法是个回调函数,当大厅的房间列表更改时会自动调用它。
以及

PhotonNetwork.GetCustomRoomList(PhotonNetwork.CurrentLobby,null);

参数自己设置,这个函数不是用来返回房间信息的,而是说调用GetCustomRoomList()会触发上面那个OnRoomListUpdate(),注意当玩家已经加入房间时是不能获取大厅列表的

下面开始获取房间列表:
在此之前你需要先定义一个Dictionary的变量,用来保存当前的房间列表,我这里命名为myRoomList。

public override void OnRoomListUpdate(List<RoomInfo> roomList)
        {
            Debug.Log("roomListUpdated");

            //pr用来暂时保存ui上的房间button,获取后先将原先显示的房间ui销毁掉
            GameObject[] pr = GameObject.FindGameObjectsWithTag("CustomRoom");
            foreach (var r in pr)
            {
                Destroy(r);
            }

            //遍历房间信息改变了的房间,注意这个roomList不包括所有房间,而是有属性改变了的房间,比如新增的
            foreach (var r in roomList)
            {
                //清除关闭或不可显示或已经移除了的房间
                if (!r.IsOpen || !r.IsVisible || r.RemovedFromList)
                {
                    if (myRoomList.ContainsKey(r.Name))//如果该房间之前有,现在没有了就去掉它
                    {
                        myRoomList.Remove(r.Name);
                    }
                    continue;
                }
                //更新房间信息
                if (myRoomList.ContainsKey(r.Name))
                {
                    myRoomList[r.Name] = r;
                }
                //添加新房间
                else
                {
                    myRoomList.Add(r.Name, r);//如果该房间之前没有,现在有了就加进myRoomList
                }
            }

            foreach(var r in myRoomList.Values)
            {
                //这个函数用来在canvas上添加房间ui的,自己定义
                UpdateRoomList(r.Name);
            }

            Debug.Log("===roomList count:" + roomList.Count + "===myRoomList count:" + myRoomList.Count);
            messageText.text = "===roomList count:" + roomList.Count + "===myRoomList count:" + myRoomList.Count;
        }

public void UpdateRoomList(string name)
        {
            //这里我已经把房间ui做成prefab保存在Resources文件夹了
            GameObject go = Instantiate(Resources.Load("CustomRoom") as GameObject);           
            go.transform.parent = roomInLobbyPanel.transform;//roomInLobbyPanel是我用来放显示房间列表的panel
            go.transform.localScale = Vector3.one;
            go.name = name;
            go.transform.Find("RoomName").GetComponent<Text>().text = name;//设置好文字为房间名
            //绑定选择房间事件(自定义)
            go.GetComponent<Button>().onClick.AddListener(delegate ()
            {
                this.ChooseRoom(go.name);
            });
        }

演示如下:
首先创建一个房间:
Photon笔记一:获取并显示房间列表_第1张图片
在另一个客户端上就可以看到:
Photon笔记一:获取并显示房间列表_第2张图片
如果你想主动获取房间列表,而不是等房间信息更新,那可以调用刚才说的GetCustomRoomList(),但是它最终还是通过OnRoomListUpdate()来实现。

你可能感兴趣的:(Unity&游戏设计)