Photon matchmaking - 在 Unity 中使用 SQL 大厅加入或创建房间
Posted
技术标签:
【中文标题】Photon matchmaking - 在 Unity 中使用 SQL 大厅加入或创建房间【英文标题】:Photon matchmaking - Join or create a room using in Unity with an SQL lobby 【发布时间】:2018-08-09 22:42:45 【问题描述】:我正在尝试在 Unity 中使用 Photon 实现基于技能的匹配。它似乎 我从文档中获得了大部分代码,它可以工作但效果不佳。 问题是您不能将 JoinOrCreate() 与 sql 大厅类型一起使用,所以我的逻辑是尝试找到一个房间,如果它创建一个失败。
void init()
_client = Game.Context.GetComponent<SocketConnectionManager>().client;
joinRoom();
public void joinRoom()
TypedLobby sqlLobby = new TypedLobby("skillLobby", LobbyType.SqlLobby);
string sqlLobbyFilter = "C0 BETWEEN 100 AND 200";
_client.OpJoinRandomRoom(null, MatchMaker.MaxPlayers, MatchmakingMode.FillRoom, sqlLobby, sqlLobbyFilter);
public void createRoom()
RoomOptions o = new RoomOptions();
o.MaxPlayers = MatchMaker.MaxPlayers;
o.CustomRoomProperties = new Hashtable() "C0", Game.Me.getInt("trophies") ;
o.CustomRoomPropertiesForLobby = new string[] "C0" ; // this makes "C0" available in the lobby
TypedLobby sqlLobby = new TypedLobby("skillLobby", LobbyType.SqlLobby);
_client.OpCreateRoom("", o, sqlLobby);
private void onEvent(EventData obj)
if (_client.CurrentRoom != null)
if (_client.CurrentRoom.PlayerCount >= _client.CurrentRoom.MaxPlayers)
// sweet I am good to go.
else
createRoom();
问题是这非常不可靠。假设两个玩家同时尝试查找游戏,他们都将搜索失败然后都创建。现在我有两个玩家坐在空房间里,而不是互相玩。
关于更好的系统的任何想法?
谢谢大家。
【问题讨论】:
【参考方案1】:感谢您选择 Photon!
首先,关于 Photon,您应该了解几件事:
您不能将 JoinOrCreate() 与 sql 大厅类型一起使用
这是不正确的。 你在哪里读到这样的东西? 你自己测试过这个吗?你到底测试了什么?
onEvent
(LoadBalancingClient.OnEventAction
) 回调不能用于通知加入随机房间操作失败。相反,您应该使用LoadBalancingClient.OnOpResponseAction
回调,如下所示:
private void OnOpResponse(OperationResponse operationResponse)
switch (operationResponse.Code)
case OperationCode.JoinRandomGame:
if (operationResponse.ReturnCode == ErrorCode.NoMatchFound)
createRoom();
break;
检测房间内的加入事件(本地或远程玩家进入房间):
private void onEvent(EventData eventData)
switch (eventData.Code)
case EventCode.Join:
int actorNr = (int)eventData[ParameterCode.ActorNr];
PhotonPlayer originatingPlayer = this.GetPlayerWithId(actorNr);
if (originatingPlayer.IsLocal)
else
break;
回答你的问题:
假设两个玩家同时尝试寻找游戏,他们都会 搜索失败,然后都创建。
关于更好的系统有什么想法吗?
没有。 此问题仅在您使用少数客户端运行某些测试的开发阶段发生。一旦你有足够的用户群,你就不会注意到这个问题。
【讨论】:
感谢您的详细解答。至于为什么我认为您不能对 OpJoinOrCreateRoom 使用 sql 过滤器,我只是没有看到该选项。使用加入随机房间时,我有一个要发送的参数是 sql 文件管理器,JoinOrCreate 没有这样的选项。如果我可以使用它,那就太好了,那么我就不需要 OnOpResponse 回调了。_client.OpJoinRandomRoom(expectedCustomRoomProperties, expectedMaxPlayers, matchmakingMode, lobby, sqlLobbyFilter);
_client.OpJoinOrCreateRoom(roomName, roomOptions, lobby);
您可以在 SQL 大厅中 OpJoin 或创建房间。我想您可能会认为 OpJoinOrCreate 会随机加入并在未找到匹配项时创建,但事实并非如此,它所做的是尝试加入一个给定其名称的房间并在它不存在时创建它。没有 OpJoinRandomOrCreate。以上是关于Photon matchmaking - 在 Unity 中使用 SQL 大厅加入或创建房间的主要内容,如果未能解决你的问题,请参考以下文章