ユーザーIDとフレンド
ユーザーID
Photonでは、プレイヤーは一意のユーザーIDを使用して識別されます。
同じユーザーIDを使用して、複数のクライアントからPhotonチャネルへの連携が可能です。
この場合には各クライアント上で、同じメッセージを受信します。
また、同じユーザーIDで接続したクライアントはすべて、同一のチャネルに連携され、いつでも同じフレンドを持つことができます。
一意のユーザーID
一般的に、ユーザーIDは表示されることを前提としていません。
この点は、ユーザー名、表示名やニックネームと異なります。
ユーザーIDは人間が読解可能である必要はなく、また人間に非常に分かりやすくする必要はありません。
つまり、たとえばGUIDをユーザーIDとして使用することも可能です。
プレイヤーごとに一意のユーザーIDを保持することの利点は以下のとおりです:
ゲームセッション間や複数のデバイス間で、データを保持します。
ルームへの再参加や、中断した時点からのプレイの再開が可能です。会ったことのあるプレイヤー全員に存在を把握され、またそれらのプレイヤーから容易に識別されるようになります。
招待や挑戦を送ったり、オンラインパーティーを開催したり、チームやギルドを作るなどしてフレンドとプレイできます。
ユーザープロファイル(例:経験、統計、実績、レベルなど)を追加して、ゲームをさらに難しくすることができます(トーナメントやスコアボードの使用も可能です)。
- PhotonのユーザーIDを外部の一意の識別子にひもづけて、別のサービスを使用することができます。
たとえばFacebookのID、GoogleのID、SteamのID、PlayFabのIDなどをPhtonのユーザーに設定可能です。 - 対象となるユーザーIDのブロックリストを保持したり、
を使用して、悪意のあるユーザーが接続しないようにすることができます。
ユーザーIDの設定
一旦認証されると、切断されるまでPhotonクライアントは同じユーザーIDを保持します。
クライアントのユーザーIDは3つの方法で設定されます:
- クライアントは、接続前に
AuthenticationValues.UserId
を設定してユーザーIDを送信します。
このオプションは、 を使用せずに、ユーザーIDを設定したい場合に役立ちます。 - 認証が成功すると、外部認証プロバイダはユーザーIDを返します。 クライアントから送信された値はすべて上書きされます。
- Photon Serverは、上記の1または2でユーザーIDを取得しないユーザーに対して、IDとしてGUIDを割り当てます。このため、匿名ユーザーもユーザーIDを持つことになります。
パブリックチャネルのユーザーリスト
パブリックチャネル内のユーザーリストについて、クライアントによりコントロールを持たせる場合は、 MaxSubscribersおよびPublishSubscribersを利用します。
仕様で、両オプションとも一度にサブスクライブするのは一つのチャネルのみで、複数のチャネルには登録しません。
MaxSubscribers
デフォルトで、パブリックチャネルのサブスクライバ数に制限はありません。ユースケースによっては、サブスクライバ数に制限を設ける必要もあります。
Photon Chatのパブリックチャネルは、作成時にサブスクライバ数に制限を設けることができます。
この制限は"MaxSubscribers"と呼ばれます。
最初のユーザーがサブスクライブしたときにパブリックチャネルが作成されるということは、MaxSubscribersが設定されるのはチャネルに最初にサブスクライブしたユーザーによってということになります。
C#
chatClient.Subscribe("theFiftyClan", creationOptions: new ChannelCreationOptions { MaxSubscribers = 50 });
クライアントがMaxSubscribersを0に設定した場合、パブリックチャネルはデフォルトのサブスクライバ数無制限の挙動をとります。
チャネルごとのMaxSubscribersを把握するには、チャネルクラスのプロパティまたは同じ名前を持つフィールドを使用します。例:C#のSDKではChatChannel.MaxSubscribers
です。
PublishSubscribers
デフォルトでは、Photon Chatのクライアントはパブリックチャネル内でのユーザーの記録をつけません。
チャネルから受信したメッセージの送信者のリストのみキャッシュします。
ユースケースによっては、Chatクライアントが現在登録中のユーザーのリストを常に必要とすることがあります。
この機能は、"PublishSubscribers"と呼ばれ、チャネルの作成の際にチャネルごとに有効にします。
最初のユーザーがサブスクライブしたときにパブリックチャネルが作成されるので、"PublishSubscribers"は、チャネルに最初にサブスクライブしたユーザーによって有効化されます。
C#
chatClient.Subscribe("specialChannel", creationOptions: new ChannelCreationOptions { PublishSubscribers = true });
クライアントは、正常にサブスクリプションが行われたか、またはイベントを経由しなかったか把握します。
通常のパブリックチャネルと同じコールバックを使用して通知できます:
C#
IChatClientListener.OnSubscribed(string[] channels, bool[] results)
パブリックvはネル内でPublishSubscribersが有効になっている場合、サブスクライブしているクライアントは前もってサブスクライブ済のユーザーのリストを受け取ります。また、同じチャネルからユーザーがサブスクライブを解除したり新しいユーザーがサブスクライブすると、毎回クライアントはイベントを使って通知を受け取ることになります。サブスクライバの初期リストと、サブスクライバのリストに変更があった際の将来のイベントの2つのメカニズムでPublishSubscribers機能は構成されています。このメカニズムによってクライアントは、常にパブリックチャネルごとの最新のサブスクライバリストを使用できます。
パブリックチャネルがPublishSubscribersを有効にしたか調べるには、チャネルクラスのプロパティもしくは同じ名前を持つフィールドを使用します。例:C#のSDKではChatChannel.PublishSubscribers
です。
パブリックチャネルのサブスクライバのリストを取得するにはチャネルクラスのプロパティもしくは同じ名前を持つフィールドを使用します。 例:C#のSDKではChatChannel.Subscribers
です。
サブスクライバリストの変更について通知を受け取るには、次のようにコールバックにサブスクライブします:
C#
IChatClientListener.OnUserSubscribed(string channel, string user)
および
C#
IChatClientListener.OnUserUnsubscribed(string channel, string user)
MaxSubscribersはPublishSubscribersと並行して使用できます。
C#
chatClient.Subscribe("evenMoreSpecialChannel", creationOptions: new ChannelCreationOptions { PublishSubscribers = true, MaxSubscribers = 16 })
ただし、組み合わせる場合、MaxSubscribersは1000が上限となります。
つまり、PublishSubscribersが有効になっている場合、クライアントが設定できるMaxSubscribersは0から1000です。
クライアントがMaxSubscribersを
に設定した場合、パブリックチャネルのMaxSubscribersは1000に設定されます。
マッチメイキングスロットの予約
プレイヤーはフレンドも同様に参加することを分かった上でルームに入る場合があります。
スロット予約を使用すると、Photonは特定のユーザー用にスロットをブロックし、マッチメイキングの際に考慮します。
スロットを予約するには、ルームに参加する際のメソッド(JoinRoom
、JoinOrCreateRoom
、JoinRandomRoom
およびCreateRoom
)で取得するexpectedUsers
パラメータがあります。
誰かが参加すると分かっている場合は、UserIDの配列を渡します。
JoinRandomRoom
の場合、サーバーはあなたと参加を予定しているプレイヤー(また、既にルームにいるアクティブなプレイヤーや予測されるプレイヤー)のために十分なスロットのあるルームを探そうとします。
現在のexpectedUsers
が変更された場合、サーバーはルーム内のクライアントに対してそれを更新します。
ルーム内の予想されるユーザーのリストを更新できます(1人以上のユーザーを追加または削除します)。これは、よく知られたルームプロパティを介して行われます。
(C#SDKでは、 Room.ExpectedUsers
を取得および設定できます)。
スロット予約に対応するには、ルーム内のUserIDのパブリッシュを有効化する必要があります。
使用例:チームマッチメイキング
これは、マッチメイキングでチームをサポートする際に使用できます。
チームのリーダーが実際のマッチメイキングをおこないます。
リーダーがルームに参加し、すべてのメンバーにスロットを予約できます:
ランダムルームを検索するには:
なにも見つからない場合には、新規作成します:
他のプレイヤーはマッチメイキングをする必要はありませんが、以下を繰り返し呼ぶ必要があります:
リーダーがルームに到着すると、FindFriends
オペレーションによってルーム名が明らかになり、すべてのプレイヤーがそのルームに参加可能となります:
フレンド
- フレンドのユーザーIDは大文字と小文字を識別します。 例:次の二つは異なるフレンドのユーザーIDです。 "mybestfriend" と "MyBestFriend"
- 同じAppIDや同じPhoton Cloudのリージョンに接続したフレンド、または同じPhotonアプリケーションのバージョンでプレイするフレンドのみが、使用しているデバイスやプラットフォームに関わらず、互いに検索することができます。
Photon Chatは、接続中のみフレンドリストをメモリに保持します。
しかし、このリストはセッション間では保持されません。
セッション間でリストを保持するには、外部サービスが必要です。
フレンドの追加と削除
フレンドをPhoton Chatに追加し、そのフレンドのステータスアップデートを受信することが可能です。
Photon Chatにフレンドを追加した場合には、そのフレンドがステータスを変更するたび、またはオフラインになるたびにイベントを受信します。
友だちを追加すると、友だちごとに初期状態を受け取り、それぞれのコールバックが発生します。
最大で、一度に512人のフレンドを追加または削除できます。
Photon Chatにフレンドを追加するには:
C#
chatClient.AddFriends(friendsUserIds);
これらのイベントの情報が不要な場合には、そのフレンドを削除でき、そのフレンドのステータスアップデートを受信する必要がなくなります。
Photon Chatからフレンドを削除するには:
C#
chatClient.RemoveFriends(friendsUserIds);
フレンドからステータスアップデートを受信するには、以下を実装する必要があります:
C#
void IChatClientListener.OnStatusUpdate(string user, int status, bool gotMessage, object message);
ステータスのアップデート
Photon Chatでは自分のステータスをアップデートし、すべてのフレンドに配信することが可能です。
以下に手順を示します:
C#
chatClient.SetOnlineStatus(statusCode);
あらかじめ定義されたオンラインステータスコードのリストは、ChatUserStatus
クラスにあります。
オンラインステータスをChatUserStatus.Invisible
に設定すると、すべてのフレンドはあなたを ChatUserStatus.Offline
とみなします。
このリストにカスタムのコードを追加し、アプリケーションで使用することが可能です。
設計上、接続時にPhoton Chatは非明示的にChatUserStatus.Online
またはその他のステータスを送信することはありません。
このため、この挙動を実現するには、接続したらすぐにオンラインである点を明示的に設定する必要があります。
任意で、アップデートされたステータスコードとともにメッセージを追加可能です。
このメッセージは2つの特殊なステータスコード、ChatUserStatus.Offline
とChatUserStatus.Invisible
の場合には送信されません。
この場合、2つのパラメータをともなう負荷メソッドを使用してください:
C#
chatClient.SetOnlineStatus(statusCode, statusMessage);
ステータスアップデート機能を使用すると、すべての型のデータ(Photonが直列化可能なもの)をフレンドとやりとりできます。
これは文字列のみに限定されません。