如何使用Photon将玩家加入人数最多且未满员的房间?
Photon 优先加入人数最多未满房间实现方案
核心思路
Photon 没有内置该匹配规则,需要你自行拉取当前 lobby 下的公开房间列表,经过过滤、排序后执行加入逻辑即可实现需求。
具体实现步骤
- 首先开启 lobby 监听:客户端调用加入默认 lobby 的接口后,会自动收到当前 lobby 下所有公开房间的列表更新回调,无需手动轮询拉取
- 拿到房间列表后先做过滤:排除满员、加密、设置为不可见的无效房间
- 对有效房间按
当前玩家数从高到低排序,取排序后的第一个房间执行加入操作 - 加入失败的场景(比如你拉取列表后瞬间该房间被其他玩家填满、或房主关闭了房间),直接按排序顺序尝试下一个房间即可
- 如果所有有效房间都加入失败,就自动创建新房间等待其他玩家加入
参考代码(Unity C# 环境)
// 房间列表更新回调 public override void OnRoomListUpdate(List<RoomInfo> roomList) { // 过滤有效房间 var validRooms = roomList.Where(room => room.IsOpen && room.IsVisible && room.PlayerCount < room.MaxPlayers ).OrderByDescending(room => room.PlayerCount).ToList(); if (validRooms.Count > 0) { // 尝试加入人数最多的房间 PhotonNetwork.JoinRoom(validRooms[0].Name); } else { // 没有有效房间则创建新房间 RoomOptions roomOptions = new RoomOptions(); roomOptions.MaxPlayers = 4; // 改成你自己的单房人数上限 PhotonNetwork.CreateRoom(null, roomOptions); } } // 加入房间失败回调 public override void OnJoinRoomFailed(short returnCode, string message) { // 加入失败时可以重新触发房间列表过滤,尝试下一个房间 OnRoomListUpdate(PhotonNetwork.GetRoomList()); }
注意事项
- 如果你的游戏有额外匹配规则(比如同模式、同段位匹配),只需要在房间过滤步骤增加对应自定义房间属性的判断即可,核心排序逻辑无需改动
- 高并发场景下如果房间数量过多,可以将过滤排序逻辑放在Photon服务器端自定义插件里实现,减少客户端计算压力,中小体量游戏客户端处理完全够用
- 玩家点击开始按钮时再触发上述匹配逻辑即可,无需提前加载房间列表
内容的提问来源于stack exchange,提问作者D YAY
相关产品推荐
相关产品推荐

