获取并显示房间列表:(不保证是最新sdk可用)
别人的教程都是用GetRoomList()方法,但是PUN2里面这个方法去掉了,改用
public override void OnRoomListUpdate(List<RoomInfo> roomList)
这个方法是个回调函数,当大厅的房间列表更改时会自动调用它。
以及
PhotonNetwork.GetCustomRoomList(PhotonNetwork.CurrentLobby,null);
参数自己设置,这个函数不是用来返回房间信息的,而是说调用GetCustomRoomList()会触发上面那个OnRoomListUpdate(),注意当玩家已经加入房间时是不能获取大厅列表的。
下面开始获取房间列表:
在此之前你需要先定义一个Dictionary<string,RoomInfo>的变量,用来保存当前的房间列表,我这里命名为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);
});
}
演示如下:
首先创建一个房间:
在另一个客户端上就可以看到:
如果你想主动获取房间列表,而不是等房间信息更新,那可以调用刚才说的GetCustomRoomList(),但是它最终还是通过OnRoomListUpdate()来实现。