招待者のみルームへ入室を許可する方法

photon_realtime_turquoise

Photon運営事務局です。大変ご無沙汰しております。

ルームの作成はユーザーが任意で行えるようにし、リストはロビーで公開するが、実際のルームへの入室は招待者のみとしたい場合があるかと思います。
その実現方法について、ご案内いたします。方法はいくつかありますが、ここでは2つご説明します。

1. ルーム名にパスワードを付加する方法

基本的な考え方

ルームを作成する際、ルーム名をシステムで一意になるよう決めたキーと前や後に招待者のみが知るパスワードを付加する方法があります。
例えば、後にパスワードを付加するとすると、ルーム名は
(キー)+”_”+(パスワード)
という形になります。
ルーム名を取得して表示する際、 “_”以降のパスワード部分は取り除いてしまい、リスト上は見えないようにしてしまいます。
そして、リストから選択されたルームに入室する際、パスワードを入力してもらい、
(リスト上で取得したルーム名からパスワードを除いたもの
(=キー))+”_”+(入力されたパスワード)
というルーム名で入室を試み、パスワードが一致すると入室が完了します。
パスワードが一致しないと、ルームが見つからないということで、入室に失敗することとなります。

ルームリストを取得して表示する場合にルーム名のフィルタリングが必要となりますが、
使用する機能は非常にシンプルな形となります。

実際の値を使った例

ここでは、キーの部分をユーザーのID(数値)、パスワードを数値4桁とします。
ユーザーID:1010のユーザーがパスワード1234でルームを作成する場合、
1010_1234
というルーム名でルームを作成します。
ルームリストを取得する場合、

  • 1010_1234
  • 1105_2468
  • 1530_9876

といった形でルームリストが取得できます。
ルーム名の_以降の部分はまず削除します。

  • 1010
  • 1105
  • 1530

このままIDを表示しても他のユーザーはわからないので、プレイヤー名に変換して表示します。

  • Photon太郎
  • Realtime野郎
  • Server花子

なお、ID->プレイヤー名の変換は、ご自身のDBを参照するのでもいいですが、2で説明するルームのカスタムプロパティを利用すると楽でしょう。
カスタムプロパティの詳細は後ほどご説明します。

入室するユーザーはこのリストから選択し、選択後パスワードを入力してもらいます。
入力してもらったパスワードを付加して、入室を試みます。
例えば、最初のルームでパスワードを1235と入力してもらった場合、
1010_1235
という名前で入室を試みます。この場合、ルーム名がマッチせずルームが見つからないということになるので、エラーとなり入室が失敗します。
パスワードを正しく1234と入力してもらった場合、
1010_1234
という名前で入室を試みます。この場合はルーム名がマッチするので、入室に成功します。

コード例

実際のコード例を示します。

ルーム作成

ルーム作成は、ルーム名だけ工夫すればOKですが、一覧で表示する際の表示名をカスタムプロパティに設定するようにしています。
PUNでの例は下記になります。

  string roomName = userid + "_" + password;
  RoomOptions roomOptions;
  roomOptions.isVisible = true;
  roomOptions.isOpen = true;
  roomOptions.customProperties = new Hashtable() {
    { "displayname",  displayname }
  };
  roomOptions.customRoomPropertiesForLobby = new string[] {
    "displayname"
  };
  PhotonNetwork.CreateRoom(roomName, roomOptions, null);

Native SDK(C#)の例は下記になります。基本的にはPUNと同様ですし、他の言語でもほぼ同様です。
なお、ここではclientインスタンスの生成に関しては省略しています。こちらは別の機会にご紹介します。

  string roomName = userid + "_" + password;
  Hashtable customGamePropeties = new Hashtable() {
    { "displayname",  displayname }
  };
  string[] propsListedInLobby = new string[] {
    "displayname"
  };
  client.OpCreateRoom(roomName, 0, customGameProperties, propsListedInLobby);

ルーム入室

入室も作成と同様にルーム名の部分だけ工夫すればOKです。
PUNの例

  string roomName = userid + "_" + password;
  PhotonNetwork.JoinRoom(roomName);

  OnPhotonJoinRoomFailed()
  {
    // 入室失敗時のコード
  }
  OnJoinedRoom()
  {
    // 入室成功時のコード
  }

Native SDK(C#)
こちらもコールバック部分についてはそれだけで分量が多くなるため省略しています。こちらも別途ご紹介します。

  string roomName = userid + "_" + password;
  client.JoinRoom(roomName);

2. ルームのカスタムプロパティ+ランダムマッチメイキングを利用する方法

基本的な考え方

もう一つの方法として、ルームのカスタムプロパティを利用する方法があります。
そして、ランダムマッチメイキングではカスタムプロパティを指定することが可能なので、それを利用します。
カスタムプロパティはハッシュテーブル形式となっています。なお、ランダムマッチメイキングする際に、ルーム名はマッチメイキングに使用できませんので、ルーム名と別に設定します。

実際の値を使った例

ここでは、ルーム名を1.と同様、ユーザーID(整数値)としていますが、一意となるキーであれば何でもかまいません。
ルーム名 => ユーザーID
カスタムプロパティ => (
    “roomname” => ユーザーID
    “password” => パスワード
    “displayname” => 表示名
)

なお、ルームのカスタムプロパティをロビーから見えるようにするためには、ルーム作成時にロビーで見えるよう指定する必要があります。
パラメータでロビーに見せたいカスタムプロパティのキーを指定します。
1.の場合で表示名をカスタムプロパティで設定すると楽と書きましたが、ここで言うdisplaynameのみ設定して、ロビーで見えるようにするということです。

入室する際は、ランダムマッチメイキングを使いますが、カスタムプロパティを指定することにより、実質的にルームを指定して入室する形となります。
カスタムプロパティ => (
    “roomname” => ユーザーID
    “password” => パスワード
)

上記に一致するルームをランダムマッチメイキングで入室するようにします。
実質的なルーム名もカスタムプロパティで指定しているので、パスワードが一致すれば入室成功、一致しなければ失敗という形になります。

コード例

ルーム作成

ルーム作成時にカスタムプロパティとして設定する部分が重要となります。また、ロビーで利用できるようにする部分も注目です。
PUNでの例

  string roomName = userid + "_" + password;
  RoomOptions roomOptions;
  roomOptions.isVisible = true;
  roomOptions.isOpen = true;
  roomOptions.customProperties = new Hashtable() {
    { "roomname",   userid },
    { "password",   password },
    { "displayname",  displayname }
  };
  roomOptions.customRoomPropertiesForLobby = new string[] {
    "roomname",
    "password",
    "displayname",
  };
  PhotonNetwork.CreateRoom(roomName, roomOptions, null);

Native SDK(C#)の例

  string roomName = userid + "_" + password;
  Hashtable customGamePropeties = new Hashtable() {
    { "roomname",   userid },
    { "password",   password },
    { "displayname",  displayname }
  };
  string[] propsListedInLobby = new string[] {
    "roomname",
    "password",
    "displayname"
  };
  client.OpCreateRoom(roomName, 0, customGameProperties, propsListedInLobby);

ルーム入室

ランダムマッチメイキング(JoinRandomRoom)を使います。その際にカスタムプロパティを指定して、実質的に一意のルームを指定する形となります。
PUNの例

  Hashtable expectedCustomProperties = new Hashtable() {
    { "roomname",   userid },
    { "password",   password },
  };
  PhotonNetwork.JoinRandomRoom(expectedCustomProperties, 0);

  OnPhotonJoinRandomRoomFailed()
  {
    // 入室失敗時のコード
  }
  OnJoinedRoom()
  {
    // 入室成功時のコード
  }

Navive SDK(C#)の場合

  Hashtable expectedCustomRoomProperties = new Hashtable() {
    { "roomname",   userid },
    { "password",   password },
  };
  client.OpJoinRandomRoom(expectedCustomRoomProperties, 0);