我正在尝试在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();
}
}
问题是,这是非常不可靠的。假设有两个玩家试图同时寻找一个游戏,那么他们都将搜索失败并随后都创建。现在我有两个球员坐在空荡荡的房间里,而不是互相玩耍。
对更好的系统有何想法?
谢谢。
答案 0 :(得分:0)
谢谢您选择光子!
首先,您应该了解有关光子的一些知识:
您不能将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;
}
}
回答您的问题:
说两个玩家尝试同时寻找一个游戏,他们都会 搜索失败,然后都创建。
关于更好的系统有什么想法吗?
不。 仅在使用几个客户端来运行一些测试的开发阶段,才会发生此问题。一旦拥有足够的用户群,您将不会注意到此问题。