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 大厅加入或创建房间的主要内容,如果未能解决你的问题,请参考以下文章

在Unity中使用Photon(网络多人联机)

photon引擎的photon引擎5分钟快速入门

一Photon 引擎

IOS的photon Flash浏览器怎么用?

Photon 容器配置

使用Photon引擎进行unity网络游戏开发——Photon常用类介绍