光子配对-在Unity中使用SQL大厅加入或创建房间

时间:2018-08-09 22:42:45

标签: unity3d photon

我正在尝试在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 个答案:

答案 0 :(得分:0)

谢谢您选择光子!

首先,您应该了解有关光子的一些知识:

  1.   

    您不能将JoinOrCreate()与sql大厅类型一起使用

    这是不正确的。 你在哪里读的东西? 你自己测试了吗?您到底测试了什么?

  2. onEventLoadBalancingClient.OnEventAction)回调不能用于通知失败的加入随机房间操作。相反,您应该使用LoadBalancingClient.OnOpResponseAction回调,如下所示:

    private void OnOpResponse(OperationResponse operationResponse) 
    {
        switch (operationResponse.Code) 
        {
            case OperationCode.JoinRandomGame:
                if (operationResponse.ReturnCode == ErrorCode.NoMatchFound) 
                {
                    createRoom();
                }
            break;
        }
    } 
    
  3. 要检测房间内的加入事件(本地或远程播放器进入房间):

    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;
        }
    }

回答您的问题:

  

说两个玩家尝试同时寻找一个游戏,他们都会   搜索失败,然后都创建。

     

关于更好的系统有什么想法吗?

不。 仅在使用几个客户端来运行一些测试的开发阶段,才会发生此问题。一旦拥有足够的用户群,您将不会注意到此问题。