どうもnisokaです。
今回もモノビットエンジンの機能をいろいろ使ってみよう!ということで、
引き続きルームのマッチング機能を充実させていきます。(前回のリンク)
環境は以下の通りです
win10 64bit, Unity2018.3.3f1, Monobit Unity Networking2.0 v2.6
やったこと
ルームにパスワードロック機能を実装して、入室制御をおこなう。
- RoomNameにルーム名、Passwordにパスワードを入力してCreateボタンを押す
- 作成された部屋が一覧表示されるので入りたい部屋のPasswordを入力してJoinボタンを押す
- パスワードの一致判定を行い、一致すれば入室できる
ルームカスタムパラメータを使ってルーム作成
// ルームカスタムパラメータ変数
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へパスワードを入力してルーム設定に反映します。(参考リンク)
パスワードを一致判定して入室制御
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()
を呼んで終了です。
最後に
余談ですが、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()をしてしまうと**「すべてのルームの中から入力したパスワードと一致する部屋に入室する」**という処理が行われます。つまり、どの部屋に対してパスワードの一致判定をおこなうのか指定が不可能のようでした。
ですので、今回クライアントの入力したパスワードと、ルームに設定されたパスワードを関数外で一致判定する必要がありました。
少しややこしかったです。