LoginSignup
2
2

More than 5 years have passed since last update.

パスワードが一致するルームを検出してマッチングをする

Last updated at Posted at 2019-04-23

どうもnisokaです。
今回もモノビットエンジンの機能をいろいろ使ってみよう!ということで、
引き続きルームのマッチング機能を充実させていきます。(前回のリンク)

環境は以下の通りです
win10 64bit, Unity2018.3.3f1, Monobit Unity Networking2.0 v2.6

やったこと

ルームにパスワードロック機能を実装して、入室制御をおこなう。
image4.PNG
1. RoomNameにルーム名、Passwordにパスワードを入力してCreateボタンを押す
2. 作成された部屋が一覧表示されるので入りたい部屋のPasswordを入力してJoinボタンを押す
3. パスワードの一致判定を行い、一致すれば入室できる

ルームカスタムパラメータを使ってルーム作成

// ルームカスタムパラメータ変数
private Hashtable customRoomParam = new Hashtable();

// パスワード入力
customRoomParam["Password"] = GUILayout.TextField(customRoomParam.ContainsKey("Password") ? customRoomParam["Password"].ToString() : "");

// ルーム設定
RoomSettings roomSetings = new RoomSettings()
{
    isVisible = true,
    isOpen = true,
    maxPlayers = maxPlayerCount,
    roomParameters = customRoomParam,
    lobbyParameters = new string[] {}
};
// ルーム作成
MonobitNetwork.CreateRoom(roomName, roomSetings, null);

MUNではisVisible(ロビーでの公開/非公開) isOpen(入室可能かどうか) maxPlayers(入室可能人数)といった基本的なルーム設定のほかに、ルームカスタムパラメータという任意のKeyにValueを指定してルーム条件を作成できます。
customRoomParam["Password"]というmapへパスワードを入力してルーム設定に反映します。(参考リンク)
image1.PNG

パスワードを一致判定して入室制御

private Hashtable joinRoomParam = new Hashtable();

// 全ルーム一覧表示
foreach (RoomData roomData in MonobitNetwork.GetRoomData())
{
    GUILayout.BeginHorizontal();

    // ルーム名ラベル表示
    GUILayout.Label("Room Name: " + roomData.name + "(" + roomData.playerCount + "/" + ((roomData.maxPlayers == 0) ? "-" : roomData.maxPlayers.ToString()) + ")");

    // パスワード入力
    GUILayout.Label("Password ");
    joinRoomParam[roomData.name] = GUILayout.TextField(joinRoomParam.ContainsKey(roomData.name) ? joinRoomParam[roomData.name].ToString() : "");

    if (GUILayout.Button("Join"))
    {
        // 一致判定
        if(roomData.customParameters["Password"].Equals(joinRoomParam[roomData.name]))
        {
            // ルームに入室
            MonobitNetwork.JoinRoom(roomData.name);
        }

        joinRoomParam[roomData.name] = "";
    }

    GUILayout.EndHorizontal();
}

MonobitNetwork.GetRoomData()で存在する全ルームの情報が取得できます。
まずforeachでRoomData roomDataにひと部屋分の情報を格納します。
つぎにRoomData.customParametersからそのルームの設定情報を取得します。
最後にルーム設定に含まれるパスワードと入力したパスワードを一致判定してMonobitNetwork.JoinRoom()を呼んで終了です。
image5.PNG

最後に

余談ですが、JoinRandomRoom()という関数にハマりました。
MUN公式サンプルの「MUNクライアントの主要機能>マッチメイキング>ルームフィルタ」には下記のようなコードがありました。

// 該当するルームに入室する
if (GUILayout.Button("Join Room", GUILayout.Width(150)))
{
    // ルームカスタムパラメータへの登録
    this.customRoomParam["Password"] = this.joinRoomPassword[roomData.name];

    MonobitNetwork.JoinRandomRoom(this.customRoomParam, 0);

    this.customRoomParam["Password"] = "";
}

公式はすべて正しいですが、この解説とコードを読む限りだと、複数個の部屋を作ったことを想定していないようです。
サンプルのままJoinRandomRoom()をしてしまうと「すべてのルームの中から入力したパスワードと一致する部屋に入室する」という処理が行われます。つまり、どの部屋に対してパスワードの一致判定をおこなうのか指定が不可能のようでした。
ですので、今回クライアントの入力したパスワードと、ルームに設定されたパスワードを関数外で一致判定する必要がありました。
少しややこしかったです。

参考リンク

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2