ユーザー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つの方法で設定されます:

  1. クライアントは、接続前にAuthenticationValues.UserIdを設定してユーザーIDを送信します。 このオプションは、 カスタム認証 を使用せずに、ユーザーIDを設定したい場合に役立ちます。
  2. 認証が成功すると、外部認証プロバイダはユーザーIDを返します。カスタム認証を参照してください。 クライアントから送信された値はすべて上書きされます。
  3. Photon Serverは、上記の1または2でユーザーIDを取得しないユーザーに対して、IDとしてGUIDを割り当てます。このため、匿名ユーザーもユーザーIDを持つことになります。

ユーザーIDを発行

プレイヤーはルーム内で互いにユーザーIDを共有できます。 これを有効化し、すべてのプレイヤーがそのユーザーIDを見えるようにするには、ルーム作成時にRoomOptions.PublishUserIdtrueに設定します。 その後、新たに参加されるたびにサーバーはこの情報を送信します。このため、PhotonPlayer.UserIdを使用すれば各プレイヤーのユーザーIDにアクセスできます。

マッチメイキングスロットの予約

プレイヤーは友達も同様に参加することを分かった上でルームに入る場合があります。 スロット予約を使用すると、Photonは特定のユーザー用にスロットをブロックし、マッチメイキングの際に考慮します。 スロットを予約するには、ルームに参加する際のメソッド(JoinRoomJoinOrCreateRoomJoinRandomRoomおよびCreateRoom)で取得するexpectedUsersパラメータがあります。

// join room example
lbClient.OpJoinRoom(roomName, expectedUsers);
// create room example
lbClient.OpJoinOrCreateRoom(roomName, roomOptions, typedLobby, expectedUsers);
// join random room example
lbClient.OpJoinRandomRoom(expectedProperties, maxPlayers, expectedUsers, matchmakingType, typedLobby, sqlLobbyFilter, expectedUsers);
// create room example
lbClient.OpCreateRoom(roomName, roomOptions, typedLobby, expectedUsers);

誰かが参加すると分かっている場合は、UserIDの配列を渡します。 JoinRandomRoomの場合、サーバーはあなたと参加を予定しているプレイヤー(また、既にルームにいるアクティブなプレイヤーや予測されるプレイヤー)のために十分なスロットのあるルームを探そうとします。 現在のexpectedUsersが変更された場合、サーバーはルーム内のクライアントに対してそれを更新します。 スロット予約に対応するには、ルーム内のUserIDのパブリッシュを有効化する必要があります。

使用例:チームマッチメイキング

これは、マッチメイキングでチームをサポートする際に使用できます。 チームのリーダーが実際のマッチメイキングをおこないます。 リーダーがルームに参加し、すべてのメンバーにスロットを予約できます:

ランダムルームを検索するには:

lbClient.OpJoinRandomRoom(expectedProperties, maxPlayers, expectedUsers, matchmakingType, typedLobby, sqlLobbyFilter, teamMembersUserIds);

なにも見つからない場合には、新規作成します:

lbClient.OpCreateRoom(roomName, roomOptions, typedLobby, teamMembersUserIds);

他のプレイヤーはマッチメイキングをする必要はありませんが、以下を繰り返し呼ぶ必要があります:

lbClient.OpFindFriends(new string[1]{ leaderUserId });

リーダーがルームに到着すると、FindFriends オペレーションによってルーム名が明らかになり、すべてのプレイヤーがそのルームに参加可能となります:

lbClient.OpJoinRoom(roomNameWhereTheLeaderIs);

友達

同じAppIDや同じPhoton Cloudのリージョンに接続した友達、または同じPhotonアプリケーションのバージョンでプレイする友達のみが、使用しているデバイスやプラットフォームに関わらず、互いに検索することができます。

同じゲームをプレイしているオンライン中の友達を検索でき、またそれらの友達がどのルームに参加しているかを検索できます。 ユーザーと同様に、友達もユーザーIDを使用して識別されます。 つまり友達IDはユーザーIDと同一で、友達を見つけるにはまず、その友達のユーザーIDを把握する必要があります。 その後、以下を使用してユーザーIDのリストを送信できます:

loadBalancingClient.FindFriends(friendsUserIds);

その後、サーバーから以下のレスポンスを取得できます:

LoadBalancingClientクラスを拡張している場合には、OnOperationResponseを上書きして以下のコードスニペットを追加してください。

もしくは、イベントLoadBalancingClient.OnOpResponseActionを使用して、実装されたコールバックに以下のスニペットを追加することも可能です。

switch(operationResponse.OpCode)
{
    case OperationCode.FindFriends:
        if (operationResponse.ReturnCode == 0)
        {
            bool[] statusArray = operationResponse[ParameterCode.FindFriendsResponseOnlineList] as bool[];
            string[] roomsArray = operationResponse[ParameterCode.FindFriendsResponseRoomIdList] as string[];

            for (int index = 0; index < this.FriendList.Count; index++)
            {
                // replace with your custom logic
                Debug.LogFormat("Friend with UserId={0} is {1}{2}",
                    this.FriendList[i],
                    statusArray[i] ? "online" : "offline",
                    string.IsNullOrEmpty(roomsArray[i]) ? string.Empty :
                    string.Format(" joined to room=\"{0}\"", roomsArray[i]));
            }
        }
        break;
}

Photonは友達リストを保持しません。

友達リストを保持するには、外部サービスが必要です。

Photonはユーザーベースをトラッキングしないため、ゲームに存在しないユーザーは単純にオフラインであるとみなされます。

FindFriendsクエリを作成時に、Photonに接続している友達のみが、オンラインであるとみなされます。 後者がオンライン中で、同じ名前でルームに参加した場合には、ユーザーごとにルーム名が返されます。

 ドキュメントのトップへ戻る