ユーザーIDとフレンド
ユーザーID
Photonでは、プレイヤーは一意のユーザーIDを使用して識別されます。
ユーザーIDはルーム内外で活用できます。
Photonクライアントは同じユーザーIDで同じサーバーに接続できます。しかし同じユーザーIDを使用して、2つのクライアントから同じPhtonのルームに参加することはできません。
ルーム内の各アクターは一意のユーザーIDを持つ必要があります。
以前のクライアントSDKでは、これはRoomOptions.CheckUserOnJoin
を使用して有効化されていました。
一意のユーザー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を持つことになります。
ユーザーIDを発行
プレイヤーはルーム内で互いにユーザーIDを共有できます。
C# SDKでこれを有効化し、すべてのプレイヤーがそのユーザーIDを見えるようにするには、ルーム作成時にRoomOptions.PublishUserId
をtrue
に設定します。
その後、新たに参加されるたびにサーバーはこの情報を送信します。このため、Player.UserId
を使用すれば各プレイヤーのユーザーIDにアクセスできます。
マッチメイキングスロットの予約
プレイヤーはフレンドも同様に参加することを分かった上でルームに入る場合があります。
スロット予約を使用すると、Photonは特定のユーザー用にスロットをブロックし、マッチメイキングの際に考慮します。
スロットを予約するには、ルームに参加する際のメソッド(JoinRoom
、JoinOrCreateRoom
、JoinRandomRoom
およびCreateRoom
)で取得するexpectedUsers
パラメータがあります。
C#
EnterRoomParams enterRoomParams = new EnterRoomParams();
enterRoomParams.ExpectedUsers = expectedUsers;
// create room example
loadBalancingClient.OpCreateRoom(enterRoomParams);
// join room example
loadBalancingClient.OpJoinRoom(enterRoomParams);
// join or create room example
loadBalancingClient.OpJoinOrCreateRoom(enterRoomParams);
// join random room example
OpJoinRandomRoomParams opJoinRandomRoomParams = new OpJoinRandomRoomParams();
opJoinRandomRoomParams.ExpectedUsers = expectedUsers;
loadBalancingClient.OpJoinRandomRoom(opJoinRandomRoomParams);
誰かが参加すると分かっている場合は、UserIDの配列を渡します。
JoinRandomRoom
の場合、サーバーはあなたと参加を予定しているプレイヤー(また、既にルームにいるアクティブなプレイヤーや予測されるプレイヤー)のために十分なスロットのあるルームを探そうとします。
現在のexpectedUsers
が変更された場合、サーバーはルーム内のクライアントに対してそれを更新します。
ルーム内の予想されるユーザーのリストを更新できます(1人以上のユーザーを追加または削除します)。これは、よく知られたルームプロパティを介して行われます。
(C#SDKでは、 Room.ExpectedUsers
を取得および設定できます)。
スロット予約に対応するには、ルーム内のUserIDのパブリッシュを有効化する必要があります。
使用例:チームマッチメイキング
これは、マッチメイキングでチームをサポートする際に使用できます。
チームのリーダーが実際のマッチメイキングをおこないます。
リーダーがルームに参加し、すべてのメンバーにスロットを予約できます:
ランダムルームを検索するには:
C#
OpJoinRandomRoomParams opJoinRandomRoomParams = new OpJoinRandomRoomParams();
opJoinRandomRoomParams.ExpectedUsers = teamMembersUserIds;
loadBalancingClient.OpJoinRandomRoom(opJoinRandomRoomParams);
なにも見つからない場合には、新規作成します:
C#
EnterRoomParams enterRoomParams = new EnterRoomParams();
enterRoomParams.ExpectedUsers = teamMembersUserIds;
loadBalancingClient.OpCreateRoom(enterRoomParams);
他のプレイヤーはマッチメイキングをする必要はありませんが、以下を繰り返し呼ぶ必要があります:
C#
loadBalancingClient.OpFindFriends(new string[1]{ leaderUserId });
リーダーがルームに到着すると、FindFriends
オペレーションによってルーム名が明らかになり、すべてのプレイヤーがそのルームに参加可能となります:
C#
EnterRoomParams enterRoomParams = new EnterRoomParams();
enterRoomParams.RoomName = roomNameWhereTheLeaderIs;
loadBalancingClient.OpJoinRoom(enterRoomParams);
フレンド
- フレンドのユーザーIDは大文字と小文字を識別します。 例:次の二つは異なるフレンドのユーザーIDです。 "mybestfriend" と "MyBestFriend"
- 同じマスターサーバーに接続したフレンドのみが、使用しているデバイスやプラットフォームに関わらず、互いに検索することができます。
- FindFriendsマスターサーバーに接続しているときのみ動作します。クライアントがルームに参加しているときは動作しません。
同じゲームをプレイしているオンライン中のフレンドを検索でき、またそれらのフレンドがどのルームに参加しているかを検索できます。
ユーザーと同様に、フレンドもユーザーIDを使用して識別されます。
つまりフレンドIDはユーザーIDと同一で、フレンドを見つけるにはまず、そのフレンドのユーザーIDを把握する必要があります。
その後、以下を使用してユーザーIDのリストを送信できます:
C#
using Photon.Realtime;
public class FindFriendsExample : IMatchmakingCallbacks
{
private LoadBalancingClient loadBalancingClient;
public bool FindFriends(string[] friendsUserIds)
{
return loadBalancingClient.OpFindFriends(friendsUserIds);
}
// do not forget to register callbacks via loadBalancingClient.AddCallbackTarget
// also deregister via loadBalancingClient.RemoveCallbackTarget
#region IMatchmakingCallbacks
public override void IMatchmakingCallbacks.OnUpdatedFriendList(List<FriendInfo> friendsInfo)
{
for(int i=0; i < friendsInfo.Count; i++)
{
FriendInfo friend = friendsInfo[i];
Debug.LogFormat("{0}", friend);
}
}
// [..] 他のコールバック実装は簡易のために外しました。このケースでは使用しないので空白にします。
#endif
}
Photonはフレンドリストを保持しません。
フレンドリストを保持するには、外部サービスが必要です。
Photonはユーザーベースをトラッキングしないため、ゲームに存在しないユーザーは単純にオフラインであるとみなされます。
FindFriendsクエリを作成時に、Photonに接続しているフレンドのみが、オンラインであるとみなされます。
後者がオンライン中で、同じ名前でルームに参加した場合には、ユーザーごとにルーム名が返されます。
同じクラスタ/VirtualApp内で、同じUserIdを持つ複数のクライアントが別々のルームに参加している場合、FindFriendsは最新の参加者を返す必要があります。
Back to top