Sessions Interface

セッションベースのマッチメイクを処理するインターフェース

30 分で読めます

Epic Online Services (EOS) によりプレイヤーは、Sessions インターフェース を通じて、オンライン ゲーミング セッションをホスト、検出、操作する機能を利用できます。ゲームを開始する前に一定数のプレイヤー スロットが埋まり、ゲーム終了後に解除する場合は、セッションが短くなることがあります。あるいは複数のマップやレベルにわたって対戦を繰り返すゲームの経過を追跡する場合などは、長くなることもあります。Sessions インターフェースは、バックエンド サービスの検索およびマッチメイク機能をサポートする、ゲーム固有のデータも管理します。このドキュメントでは、Sessions インターフェースの定義とヘッダの一部を取り扱います。完全なリストについては、Sessions インターフェース API リファレンス ドキュメントを参照してください。

Sessions インターフェースを使用するには、プラットフォーム インターフェース の関数である EOS_Platform_GetSessionsInterface を通じて EOS_HSessions ハンドルを取得する必要があります。すべての Sessions インターフェースの関数は、1 つ目のパラメータとしてこのハンドルを使用する必要があります。リクエストが完了したときにコールバックがトリガーされるようにするには、EOS_HPlatform ハンドルがティックしていることを確認する必要があります。ティックの詳細については、C# での EOS SDK ドキュメントを参照してください。

このインターフェースを使用するときのさまざまな考慮事項については、セキュリティ ドキュメント を確認してください。

アクティブセッション

Sessions インターフェースが実行するあらゆることの中核にアクティブ セッションはあります。アプリケーションは、同時に複数のアクティブ セッションを使用でき、それぞれがユニークなローカル名で識別されます。たとえば、「Party」というセッションに、他のチームと対戦時に使用するため、ローカル プレイヤーのフレンドをまとめて保持します。さらに「Game」セッションには、現在進行中の対戦における他のプレイヤー、およびすべてのプレイヤー、または一部のフレンドが含まれます。各セッションには、参加している各プレイヤーのシステムで独自の EOS_HActiveSession ハンドルがあります。アクティブ セッションがプレイヤーのマシンに作られるのは、プレイヤーがセッションを作成した、あるいはオンライン検索で見つかった、または招待を通じてセッションに参加するときです。アクティブ セッションはローカルに存在するため、必要なくなったときに、ローカルのアプリケーションがそれらのセッションを破棄する必要があります。ホストが破棄できない場合、バックエンド サービス サーバーはセッションの破棄を遅らすことになり、オンライン検索で他のプレイヤーが存在するものとして検出してしまう可能性があります。

名前、作成または参加したローカル ユーザーの ID、現在の状態、セッションの詳細への参照 (EOS_SessionDetails_Info への定数ポインタ) および任意のユーザー定義データ属性といった、アクティブ セッション用の高レベル情報 (型 EOS_ActiveSession_Info) のコピーを取得するには、まず次のとおり初期化した EOS_Sessions_CopyActiveSessionHandleOptions を使用してローカル関数 EOS_Sessions_CopyActiveSessionHandle を呼び出して、アクティブ セッション ハンドル (型 EOS_HActiveSession) を取得します。

プロパティ
ApiVersionEOS_SESSIONS_COPYACTIVESESSIONHANDLE_API_LATEST
SessionNameセッション ハンドルを取得する対象セッションの名前

このハンドルを使用して、EOS_ActiveSession_CopyInfo を呼び出せます。次のとおり EOS_ActiveSession_CopyInfoOptions を初期化して渡す必要もあります。

プロパティ
ApiVersionEOS_ACTIVESESSION_COPYINFO_API_LATEST

この関数もローカルで実行され、成功時に、セッションの EOS_ActiveSession_Info データのコピーが作成されます。必要がなくなった場合は、EOS_ActiveSession_Info_Release を呼び出してこのコピーを解放する必要があります。

セッションの詳細

ローカルで作成する、または検索、招待、または他のユーザーの プレゼンス データを通じて検出されたアクティブ セッションは、EOS_SessionDetails_Info という内部データ構造体を格納します。この構造体にはセッションに関する次の基本情報が含まれます。

  • セッション ID

  • ホストアドレス

  • セッションの空きスロット数

この構造体には別の構造体 EOS_SessionDetails_Settings へのポインタも含まれます。次のとおりセッションのステートに関する詳細情報が得られます。

  • バケット ID というトップレベルのフィルタ基準、これはゲームに固有で、多くの場合「GameMode:Region:MapName」という形式になっています。

  • セッションで許可されている総接続数

  • 途中参加設定

  • プライバシー設定

セッションの詳細にアクセスする

EOS_ActiveSession_Info データ構造体がある場合、その SessionDetails 変数により、当該セッションの EOS_SessionDetails_Info にアクセスできます。この構造体がない場合は、EOS_HSessionDetails ハンドルを使用して、EOS_SessionDetails_CopyInfo を呼び出し、EOS_SessionDetails_Info データのコピーを取得できます。次の情報が格納されている EOS_SessionDetails_CopyInfoOptions 構造体を指定して EOS_SessionDetails_CopyInfo を呼び出します。

プロパティ
ApiVersionEOS_SESSIONDETAILS_COPYINFO_API_LATEST

成功すると、セッションの EOS_SessionDetails_Info のコピーが返ります。そこに含まれるのは、セッションの ID、ホストのアドレス、セッションの空きスロット数です。この情報が不要になったら、EOS_SessionDetails_Info_Release を呼び出して解放します。

セッションを作成する

セッションの作成は 2 段階のプロセスです。

まず、EOS_Sessions_CreateSessionModification 関数で、セッションの初期状態と設定をローカルに指定します。次の情報を含む EOS_Sessions_CreateSessionModificationOptions 構造体を渡す必要があります。

プロパティ
ApiVersionEOS_SESSIONS_CREATESESSIONMODIFICATION_API_LATEST
SessionNameセッションの名前。対象ユーザーにより作成されたセッションで一意の名前。
BucketIdセッション検索に使用する最上位のゲーム固有のフィルタリング情報。この基準はほとんど静的でおおまかに設定する必要があります。多くの場合、「GameMode:Region:MapName」という形式にします。
MaxPlayersいつでもセッションに許可される最大プレイヤー数
LocalUserIdセッションに関連付けられているユーザー ID
bPresenceEnabledこのセッションがローカル ユーザーのプレゼンス情報に関連付けられたものかどうか (詳細については、プレゼンス インターフェース を参照)
SessionId(任意) 作成時に通常、対象セッションに割り当てられるユニークな ID をオーバーライドするためにこの値を設定します。他のデベロッパー ID と関連する値をこれに設定することができます。この方法により、「プライベート セッション」を見つけるために、セッションに属性を追加することも、セッションをパブリックに公開する必要もなくなります。この値はアプリケーション エコシステム内全体でユニークでなければなりません。そうでない場合は、結果として「EOS_Sessions_SessionAlreadyExists」エラーが発生します。
bSanctionsEnabled処罰対象ユーザーがこのセッションに参加できないようにする必要があるかどうかを示します。該当ユーザーで Join および RegisterPlayers への呼び出しが成功しないようになります。詳細については Sanctions インターフェース ドキュメントを参照してください。

EOS_Sessions_CreateSessionModification 呼び出しが成功すると、EOS_Success が返り、指定したデフォルトの EOS_HSessionModification には有効なハンドルが入ります

次に、必要なすべての変更が完了するまで、セッションの初期設定の変更を続けます (セッションを変更する のセクションを参照)。次のとおり初期化された EOS_Sessions_UpdateSessionOptions 構造体を指定して EOS_Sessions_UpdateSession を呼び出すことで、作成プロセスを完了できます。

プロパティ
ApiVersionEOS_SESSIONS_UPDATESESSION_API_LATEST
SessionModificationHandle作成または更新するセッションのハンドル (EOS_HSessionModification)

EOS_Sessions_UpdateSession は非同期であり、完了時にEOS_Sessions_UpdateSessionCallbackInfo データ構造体を指定して、デリゲート (型 EOS_Sessions_OnUpdateSessionCallback) を呼び出します。成功すると、指定したローカル名は、サーバーからの検索可能なユニークな ID 文字列と組み合わされます。

プレイヤーの詳細

アクティブ セッションから次のプレイヤー データを取得できます。

  • 登録プレイヤーの総数
  • 登録プレイヤーごとの製品ユーザー ID (PUID)

登録プレイヤーの総数にアクセスする

EOS_ActiveSession_GetRegisteredPlayerCount を呼び出し、アクティブ セッションに関連付けられた登録プレイヤーの総数を取得できます。これを実行するには、次の情報を含む ActiveSessionGetRegisteredPlayerCountOptions 構造体を指定して、EOS_ActiveSession_GetRegisteredPlayerCount を呼び出します。

プロパティ
ApiVersionEOS_ACTIVESESSION_GETREGISTEREDPLAYERCOUNT_API_LATEST

登録プレイヤーごとに製品ユーザー ID にアクセスする

アクティブ セッションに対して登録プレイヤーをイテレートして、各登録プレイヤーの製品ユーザー ID (PUID) を取得します。これを実行するには、次の情報を含む ActiveSessionGetRegisteredPlayerByIndexOptions 構造体を指定して、EOS_ActiveSession_GetRegisteredPlayerByIndex を呼び出します。

プロパティ
ApiVersionEOS_ACTIVESESSION_GETREGISTEREDPLAYERBYINDEX_API_LATEST
PlayerIndex取得する登録プレイヤーのインデックス。

成功すると、アクティブ セッションの指定したインデックスに対する、プレイヤーの製品ユーザー ID (PUID) が返ります。

セッションを変更する

既存のセッションを変更するには、デフォルトの EOS_HSessionModification オブジェクトへのポインタ、および次のとおり初期化した EOS_Sessions_UpdateSessionModificationOptions 構造体を指定して、まず EOS_Sessions_UpdateSessionModification を呼び出します。

プロパティ
ApiVersionEOS_SESSIONS_UPDATESESSIONMODIFICATION_API_LATEST
SessionName変更するセッションの名前

この呼び出しが成功すると、EOS_Success が返り、変更がローカル セッションに適用され、指定した EOS_HSessionModification オブジェクトが有効なハンドルになります。セッション オーナーである場合、このハンドルを使用して、実行したローカルの変更を、EOS_Sessions_UpdateSession を呼び出して、セッションのバックエンド サービスのバージョンに適用できます。この関数は新しいセッション (サーバーでまだ作成されていないセッション) と既存のセッションの両方で動作します。次の関数はセッションの多様な要素を変更します。

関数 エフェクトの内容
EOS_SessionModification_SetHostAddress サーバーに到達するために必要なデータを含む文字列を変更します。このホスト アドレスは IP アドレスである必要はなく、ソケット ID、URL などの属性でも動作します。
EOS_SessionModification_SetBucketId バケット ID はメインの検索基準で、すべての検索で必要になるゲーム固有の情報を含みます。たとえば、「GameMode:Region:MapName」という形式が、バケット ID を構成するために使用できます。
EOS_SessionModification_SetMaxPlayers これを使用して、セッションで許可される最大プレイヤー数を設定します。
EOS_SessionModification_SetJoinInProgressAllowed この関数により、すでに開始されているゲームへの途中参加をプレイヤーに許可/禁止できます (詳細については、プレイを開始および終了する を参照)。
EOS_SessionModification_SetPermissionLevel この関数はセッションのプライバシー設定を次のいずれかに変更できます。
  • EOS_OSPF_PublicAdvertised:セッションはすべてのプレイヤーに表示され、検索でも見つかります。
  • EOS_OSPF_JoinViaPresence:作成するユーザーのプレゼンス情報 (セッション ID を含む) にアクセスできるプレイヤーのみがこのセッションを見つけられます。
  • EOS_OSPF_InviteOnly:セッションは招待されたユーザーのみが利用できます。
EOS_SessionModification_AddAttribute カスタム属性 (型 EOS_SessionDetails_AttributeData) をセッションに追加します。詳細については、「カスタム属性」 セクションを参照してください。
EOS_SessionModification_RemoveAttribute カスタム属性をセッションから除去します。詳細については、「カスタム属性」 セクションを参照してください。

セッションをローカルで変更した後、セッション オーナーである場合は、バックエンド サービスでそのセッションを更新できます。これを実行するには、次の情報を含む EOS_Sessions_UpdateSessionOptions を指定して EOS_Sessions_UpdateSession を呼び出します。

プロパティ
ApiVersionEOS_SESSIONS_UPDATESESSION_API_LATEST
SessionModificationHandleサーバーが作成または更新するセッションのハンドル (EOS_HSessionModification)

この処理は、完了すると、EOS_Sessions_UpdateSessionCallbackInfo データ構造体を指定して、EOS_Sessions_OnUpdateSessionCallback 型のコールバック関数を呼び出します。

カスタム属性

セッションにはユーザー定義データ (つまり 属性 ) を含めることができます。各属性には、文字列キーとして機能する「名前」、値の型を識別する列挙型変数である「値」、可視性設定があります。次の変数型が現在サポートされています。

EOS_ESessionAttributeType値の型
EOS_SAT_BOOLEANEOS_Bool
EOS_SAT_INT64int64_t
EOS_SAT_DOUBLEdouble
EOS_SAT_STRINGconst char* (null が終端の UTF8 文字列)

次の可視性タイプを使用できます。

EOS_ESessionAttributeAdvertisementType可視性
EOS_SAAT_DontAdvertise他のユーザーに表示されない
EOS_SAAT_Advertise他のユーザーに表示される

属性にアクセスする

有効な EOS_HSessionDetails ハンドルと次の情報を含む EOS_SessionDetails_CopySessionAttributeByIndexOptions を指定して EOS_SessionDetails_GetSessionAttributeCount を呼び出すことにより、セッションにある属性数を確認できます。

プロパティ
ApiVersionEOS_SESSIONDETAILS_GETSESSIONATTRIBUTECOUNT_API_LATEST

属性のコピーを取得するには、有効な EOS_HSessionDetails ハンドルと次のとおり初期化された EOS_SessionDetails_CopySessionAttributeByIndexOptions を指定して、EOS_SessionDetails_CopySessionAttributeByIndex を呼び出します。

プロパティ
ApiVersionEOS_SESSIONDETAILS_COPYSESSIONATTRIBUTEBYINDEX_API_LATEST
AttrIndexコピーする属性のインデックス

成功すると、EOS_Success が返り、出力パラメータに、要求した属性インデックスに対応する EOS_SessionDetails_Attribute 構造体のコピーが含まれます。この構造体には、EOS_Sessions_AttributeData データ構造体にある属性の値と型、および EOS_ESessionAttributeAdvertisementType 列挙値の可視性が含まれます。このデータが不要になったら、EOS_SessionDetails_Attribute_Release で解放します。

属性を追加する

EOS_Sessions_AttributeData データ構造体に次の情報を入力することで、追加または変更する属性を設定できます。

プロパティ
ApiVersionEOS_SESSIONS_SESSIONATTRIBUTEDATA_API_LATEST
Key属性の名前
Value属性の値またはポインタ (文字列の場合)
ValueTypeValue を説明する EOS_ESessionAttributeType

このデータの準備ができたら、EOS_SessionModification_AddAttribute を呼び出して属性を追加します。EOS_HSessionModification ハンドルと次のとおり初期化された EOS_SessionModification_AddAttributeOptions を指定する必要があります。

プロパティ
ApiVersionEOS_SESSIONMODIFICATION_ADDATTRIBUTE_API_LATEST
SessionAttribute実行する変更を含む EOS_Sessions_AttributeData への定数ポインタ
AdvertisementTypeこの属性を公開するかどうかを示す EOS_ESessionAttributeAdvertisementType

1 つのセッションには最大 EOS_SESSIONMODIFICATION_MAX_SESSION_ATTRIBUTES (現在 64) の属性を格納でき、各属性の名前は、最大 EOS_SESSIONMODIFICATION_MAX_SESSION_ATTRIBUTE_LENGTH (現在 32) 文字にすることができます。

この関数で実行できるのは、追加または更新する属性の設定だけです。実際に属性を追加/更新する、またはセッションとやり取りすることはまったくありません。この セクション の冒頭で説明したように、EOS_Sessions_UpdateSession を呼び出す必要がいずれにしてもあります。

属性を削除する

属性を削除するには、セッションの EOS_HSessionModification ハンドルと、次の情報を含む EOS_SessionModification_RemoveAttributeOptions 構造体を指定して、EOS_SessionModification_RemoveAttribute を呼び出します。

プロパティ
ApiVersionEOS_SESSIONMODIFICATION_REMOVEATTRIBUTE_API_LATEST
Key除去する属性の名前 (キー)

この関数で設定するのは、特定の属性が除去する対象であることだけです。実際にこの属性を除去する、またはセッションとやり取りすることはまったくありません。この セクション の冒頭で説明したように、EOS_Sessions_UpdateSession を呼び出す必要がいずれにしてもあります。

プレイヤーをセッションに招待する

アクティブ セッションに参加するように別のプレイヤーを招待するために、セッションの 登録 メンバーは、次のデータを含む EOS_Sessions_SendInviteOptions 構造体を指定して EOS_Sessions_SendInvite を呼び出すことができます。

プロパティ
ApiVersionEOS_SESSIONS_SENDINVITE_API_LATEST
SessionNameプレイヤーが招待されるセッションの名前
LocalUserId招待を送るローカル ユーザー
TargetUserId招待されるリモート ユーザー

サーバーが招待要求を処理すると、EOS_Sessions_OnSendInviteCallback 型のコールバックは、結果コードを含む EOS_Sessions_SendInviteCallbackInfo 構造体で実行されます。招待の送信プロセスでエラーが発生しない場合は結果が成功になりますが、成功はリモート ユーザーが招待を受諾したことでも、確認したことでもありません。

Epic Games Launcher の招待機能では、必ずデプロイメントを アーティファクト にもマップしてください。

リモート ユーザーは招待が届くとその通知を受け取り、そのペイロードには招待されたユーザー ID と招待自体の ID が含まれます。受け取ったら、EOS_Sessions_CopySessionHandleByInviteId を使用して、招待から EOS_HSessionDetails ハンドルを取得します。このハンドルを使用して、関連セッションの セッションの詳細 データにアクセスする、または招待を受諾/拒否できます。このハンドルでの処理が終了したら、EOS_SessionDetails_Release を呼び出してハンドルを解放します。

この通知を受け取るには、EOS_Sessions_AddNotifySessionInviteReceived を指定して、コールバックを登録する必要があります。通常、これは起動時に 1 回実行する必要があり、それ以降は招待を受け取るたびにコールバックが実行されます。通知が不要になったら、EOS_Sessions_RemoveNotifySessionInviteReceived を呼び出してコールバックを除去します。

招待を受ける

Sessions インターフェースには、招待を受ける専用の関数はありません。招待から取得した EOS_HSessionDetails ハンドルを指定し、標準メソッドを使用して、セッションに 参加 できます。保留中の招待すべてを含むリストを要求するには、次のとおり初期化した EOS_Sessions_QueryInvitesOptions データ構造体で EOS_Sessions_QueryInvites を呼び出します。

プロパティ
ApiVersionEOS_SESSIONS_QUERYINVITES_API_LATEST
LocalUserId招待が要求されているユーザー

この処理は非同期です。終了すると、EOS_Sessions_QueryInvitesCallbackInfo データ構造体を指定して、型 EOS_Sessions_OnQueryInvitesCallback のコールバック関数を呼び出します。成功すると、EOS は対象ユーザーの保留中の招待すべてをローカルにキャッシュします。EOS_Sessions_GetInviteCount を使用して、キャッシュ内の招待数を特定できます。次の情報が入った EOS_Sessions_GetInviteCountOptions 構造体を渡します。

プロパティ
ApiVersionEOS_SESSIONS_GETINVITECOUNT_API_LATEST
LocalUserId招待がキャッシュされたローカル ユーザー

この関数はローカルに実行され、現在キャッシュ内にある招待数を表す uint32_t を返します。キャッシュされた招待の ID を取得するには、次の情報を含む EOS_Sessions_GetInviteIdByIndexOptions を指定して EOS_Sessions_GetInviteIdByIndex を呼び出します。

プロパティ
ApiVersionEOS_SESSIONS_GETINVITEIDBYINDEX_API_LATEST
LocalUserId招待がキャッシュされたローカル ユーザー
Index取得する ID に対する招待のキャッシュ インデックス

EOS_Sessions_GetInviteIdByIndexEOS_Success を返す場合、渡した出力パラメータには、招待の ID (null が終端の文字列と文字列長) が含まれます。

招待の ID 文字列の最大長は EOS_SESSIONS_INVITEID_MAX_LENGTH (現在は 64) です。

に説明したように、EOS_Sessions_CopySessionHandleByInviteId 関数は、EOS_HSession ハンドルを提供し、それにより、関連セッションの セッションの詳細 データにアクセスできます。セッションに 参加する ことで、招待を受け入れる、招待を無視する、または 拒否する ことを選択できます。EOS_HSession ハンドルの使用が終了したら、EOS_SessionDetails_Release を呼び出して、解放します。

招待を拒否する

招待を拒否するには、次のように初期化した EOS_Sessions_RejectInviteOptions を使用して EOS_Sessions_RejectInvite を呼び出します。

プロパティ
ApiVersionEOS_SESSIONS_REJECTINVITE
LocalUserId招待を拒否するローカル ユーザー
InviteId招待の ID

完了すると、成功/失敗を示す EOS_Sessions_RejectInviteCallbackInfo データ構造体を含む EOS_Sessions_OnRejectInviteCallback コールバック関数の呼び出しを受け取ります。招待の拒否に成功すると、招待がシステムから完全に削除されます。

リモート セッションを検出する

リモート セッションを検出するには、検索を設定し、その検索を実行して、結果を調べる必要があります。

検索を設定する

検索を始めるには、まず EOS_Sessions_CreateSessionSearch を呼び出し、検索ハンドルを作成します。次のとおり初期化した、EOS_Sessions_CreateSessionSearchOptions 構造体を渡します。

プロパティ
ApiVersionEOS_SESSIONS_CREATESESSIONSEARCH_API_LATEST
MaxSearchResults返される検索結果の最大数。

この関数はローカルで実行され、成功時にデフォルトの検索ハンドル (型 EOS_HSessionSearch) が入ります。次のステップは、ハンドルを設定して、必要とする基準で特定の検索を実行することです。EOS では、セッションの検索に次の 3 種類の方法が用意されています。

  • セッション ID: 既知の ID で単一のセッションを検索する

  • ユーザー ID: 既知のユーザーに関連するすべてのセッションを検索する — 現在はローカル ユーザーに限定

  • 属性データ: ユーザー定義のフィルタ基準のいずれかに一致するすべてのセッションを検索する

セッション ID を設定する

特定のセッションが必要で、そのサーバー側 ID がわかっている場合は、検索ハンドルと次のとおり初期化した EOS_SessionSearch_SetSessionIdOptions を指定して、EOS_SessionSearch_SetSessionId を呼び出します。

プロパティ
ApiVersionEOS_SESSIONSEARCH_SETSESSIONID_API_LATEST
SessionId検索するセッションの ID

これはセッション ID 検索を設定するために必要な唯一のステップです。他の検索方法と異なり、この方法では複数の結果が返ることはありません。

EOS_OSPF_PublicAdvertised または EOS_OSPF_JoinViaPresence とマークされたセッションのみがこの方法で見つかります。

ユーザー ID を設定する

既知のユーザーに関わるすべてのセッションを見つけるには、検索ハンドルと次の情報を含む EOS_SessionSearch_SetTargetUserIdOptions を指定して、EOS_SessionSearch_SetTargetUserId を呼び出します。

プロパティ
ApiVersionEOS_SESSIONSEARCH_SETTARGETUSERID_API_LATEST
TargetUserIdセッション内で検索するユーザー ID

これはユーザー ID 検索を設定するために必要な唯一のステップです。ローカル ログインユーザーであることが必要です。

アプリケーションはローカルに認証されたユーザーまたはパブリック セッションに登録されたリモート ユーザーのみを検索できます。

属性データを設定する

セッションを見つける最も堅実な方法は、フィルタとして機能する、一連の検索パラメータを基に検索することです。特定のゲーム タイプやマップをユーザーが選択できるようにするなど、一部のパラメータをそのユーザーに公開できますが、適切な対戦相手との対戦を見つけるために、プレイヤーの推定スキル レベルを使用するときなど、他のパラメータは公開しないことがあります。この検索方法では、複数のパラメータを使用することができ、すべてに該当するセッションのみを見つけます。検索パラメータを設定するには、検索ハンドルと次の情報を含む EOS_SessionSearch_SetParameterOptions を指定して、EOS_SessionSearch_SetParameter を呼び出します。

プロパティ
ApiVersionEOS_SESSIONSEARCH_SETPARAMETER_API_LATEST
Parameterセッションに関連付けられている 属性 と比較するキーと値
ComparisonOp比較する型

この関数を複数回呼び出すことで、複数のフィルタを設定できます。検索結果で表示されるためにセッションが満たす必要があるすべてのフィルタです。次の表に、使用できる比較のタイプ、それらが機能する値の型、表示に必要な条件の種類のリストを示します。

ComparisonOp受け入れ可能な値の型成功条件
EOS_CO_EQUALすべて属性は検索値に等しい
EOS_CO_NOTEQUALすべて属性は検索値に等しくない
EOS_CO_GREATERTHAN数値型属性は検索値より大きい
EOS_CO_GREATERTHANOREQUAL数値型属性は検索値以上
EOS_CO_LESSTHAN数値型属性は検索値より小さい
EOS_CO_LESSTHANOREQUAL数値型属性は検索値以下
EOS_CO_DISTANCE数値型フィルタではなく、属性が検索値にどれだけ近いか、つまり Abs(AttributeValue - SearchValue) でソートされる
EOS_CO_ANYOF文字列属性はセミコロン区切りのリストにあるいずれかのメンバーに一致 (たとえば、 "This;OrThis;MaybeThis")
EOS_CO_NOTANYOF文字列属性はセミコロン区切りのリストにあるいずれのメンバーにも一致しない (たとえば、"NotThis;OrThisEither")

検索を実行する

検索を実行するには、検索ハンドルと次のとおり初期化された EOS_SessionSearch_FindOptions 構造体を指定して、EOS_SessionSearch_Find を呼び出します。

これは非同期処理です。終了すると、型 EOS_SessionSearch_OnFindCallback のコールバック関数は、検索の成功/失敗を通知する EOS_SessionSearch_FindCallbackInfo 構造体を受け取ります。正常に完了した後、EOS キャッシュから検索結果のコピーを取得できます。

EOS では、複数の EOS_SessionSearch_Find の並列処理をサポートしています。

ヒント:属性 EOS_SESSIONS_SEARCH_MINSLOTSAVAILABLE による検索で、満員ではない (利用できるスロットがまだある) セッションを見つけます。値の型を int64_t に設定し、EOS_CO_GREATERTHANOREQUAL 比較演算子を使用して、値を少なくとも 1 に設定します。これにより結果から満員であるセッションが除外されます。

検索結果を調べる

EOS_HSessionSearch ハンドルを指定した EOS_SessionSearch_GetSearchResultCountEOS_SessionSearch_CopySearchResultByIndex は、個別の EOS_HSessionDetails ハンドルを通じて 1 件ずつセッションの詳細を返します。

検索が正常に完了したら、検索ハンドルと EOS_SessionSearch_GetSearchResultCount を使用して、検索から返った結果の数を取得します。それから EOS_SessionSearch_CopySearchResultByIndex を呼び出して、対象インデックスで アクティブ セッション と関連がある EOS_HSessionDetails ハンドルのコピーを取得できます。このハンドルにより、セッションの詳細 データにアクセスでき、これを使用してローカル ユーザーにセッションに関する情報を表示する、または独自のゲーム ロジックを使用して、セッションに 参加する かどうかを特定できます。不要になったら、EOS_SessionDetails_Release を使用して、EOS_HSessionDetails ハンドルを解放する必要があります。

セッションに参加する

次の情報が入った EOS_Sessions_JoinSessionOptions 構造体を指定し、EOS_Sessions_JoinSession を呼び出すことで、有効な EOS_HSessionDetails ハンドルがある場合に、既存のセッションに参加できます。

プロパティ
ApiVersionEOS_SESSIONS_JOINSESSION_API_LATEST
SessionNameローカル システムがセッションを参照するために使用するユニークな名前
SessionHandle参加するセッションの EOS_HSessionDetails ハンドル
LocalUserIdセッションに参加するローカル ユーザー
bPresenceEnabledこのセッションがローカル ユーザーのプレゼンス情報に関連付けられたものかどうか (詳細については、プレゼンス インターフェース を参照)

処理が終了すると、型 EOS_Sessions_OnJoinSessionCallback のコールバック関数は、成功/失敗を示す EOS_Sessions_JoinSessionCallbackInfo を受け取ります。処理が成功すると、EOS は参加するクライアントのシステムにアクティブ セッションを作成します。この新しいセッションはローカルで所有されているため、参加するユーザーは、不要になったときに、セッションを 破棄する 必要があります。

プレイヤーを登録する

プレイヤーがセッションに参加するとき、セッション オーナーは、プレイヤーをセッションに登録する責任があります。これにより、バックエンド サービスはプレイヤー数を常に把握できるため、満員になったときに、セッションのアドバタイズを停止できます。EOS では、EOS_Sessions_RegisterPlayers 関数を通じて、一度に複数のプレイヤーの登録を受け付けます。次のデータを含む EOS_Sessions_RegisterPlayersOptions 構造体を使用して、所有しているクライアントからこの関数を呼び出します。

プロパティ
ApiVersionEOS_SESSIONS_REGISTERPLAYERS_API_LATEST
SessionNameセッションのローカル名
PlayersToRegister参加するプレイヤーの ID の配列
PlayersToRegisterCountPlayersToRegister の要素数

完了すると、型 EOS_Sessions_OnRegisterPlayersCallback の呼び出しは、次のデータを含む EOS_Sessions_RegisterPlayersCallbackInfo パラメータで実行されます。

プロパティ
ResultCode成功か失敗を示す結果コード
Registered Players正常に登録されたプレイヤーのリスト
Registered Players Count登録されたプレイヤー数
Sanctioned Players処罰のために登録されなかったプレイヤーのリスト
Sanctioned Players Count処罰のため登録されなかったプレイヤー数

呼び出しが成功すると、新規登録プレイヤーは、他のプレイヤーをセッションに招待する機能など、一部のセッション管理機能にアクセスできるようになります。1 人以上の処罰プレイヤーの登録が拒否されたとき、エラーが返らないことに注意してください。*SanctionedPlayers リストは手動でチェックする必要があります。*詳細については、処罰を実行する を参照してください。EOS はプレイヤーがセッションに参加するとき通知をしません。つまり参加するときオーナーに通知するか、プレイヤーが正常にセッションに参加したことを検出する方法をオーナーに用意する必要があります。

ユーザーがパブリックに表示されるセッション (EOS_OSPF_PublicAdvertised または EOS_OSPF_JoinViaPresence で設定されたセッション) に登録した後、他のユーザーは EOS_SessionSearch_SetTargetUserId でそのセッションを見つけることができます。

セッションから離脱する

Sessions インターフェースには、セッションから離脱するための専用関数はありません。セッションから離脱するには、ローカル名を使って、標準方法でローカル セッションを 破棄 します。

プレイヤーの登録を削除する

プレイヤーがセッションを離脱するとき、セッションのオーナーはプレイヤーの登録を削除する責任があります。これによりサーバーがプレイヤー スロットを解放できるため、それ以降プレイヤーが参加できるようになります。EOS は EOS_Sessions_UnregisterPlayers 関数で一度に複数プレイヤーの登録削除を受け付けます。次のデータを含む EOS_Sessions_UnregisterPlayersOptions 構造体を使用して、所有しているクライアントからこの関数を呼び出します。

プロパティ
ApiVersionEOS_SESSIONS_UNREGISTERPLAYERS_API_LATEST
SessionNameセッションのローカル名
PlayersToUnregister離脱するプレイヤーの ID の配列
PlayersToUnregisterCountPlayersToUnregister の要素数

完了すると、型 EOS_Sessions_OnUnregisterPlayersCallback の呼び出しは、成功/失敗を示す EOS_Sessions_UnregisterPlayersCallbackInfo パラメータで実行されます。呼び出しが成功すると、バックエンド サービスは、プレイヤーが最初に登録したときに受けとったセッション管理アクセスを取り消します。たとえば、セッションに登録されていないプレイヤーは他のユーザーが参加するようにセッションに招待できません。EOS はプレイヤーがセッションから離脱することを通知しません。つまりセッションから離脱するときに、オーナーに通知するか、プレイヤーがゲームを離れた、または接続が切れたことを検出する方法をオーナーに用意する必要があります。

ホスト移行はセッションに対してサポートされていません。セッションのオーナーが離れる、またはネットワークへの接続を失うと、セッションは孤立し、バックエンドで誰もこのセッションを管理できません。

プレイを開始および終了する

プレイヤーはローカルのアクティブ セッションで対戦が開始または終了したことを宣言できます。ローカル プレイヤーが所有するバックエンド サービスのセッションに対象セッションがマップされている場合、バックエンド バージョンでもプレイを開始または終了します。プレイ中に、対象セッションで Join in Progress (途中参加) が無効になっている場合、バックエンド サービスはセッションへの参加を自動的に拒否します (詳細については、セッションを変更する のセクションを参照)。通常、セッションの開始は、対戦が始まったことを示していますが、この機能の個別の使い方はゲームのデベロッパーに任されています。

プレイを開始するには、次のとおり初期化された EOS_Sessions_StartSessionOptions を指定して EOS_Sessions_StartSession を呼び出します。

プロパティ
ApiVersionEOS_SESSIONS_STARTSESSION_API_LATEST
SessionNameセッションのローカル名

処理が完了したら、型 EOS_Sessions_OnStartSessionCallback のコールバック関数は、成功/失敗を示す EOS_Sessions_StartSessionCallbackInfo データ構造体を使用して実行します。処理が成功すると、次の情報を含む EOS_Sessions_EndSessionOptionsEOS_Sessions_EndSession を呼び出すことで、プレイを終了するまで、セッションは「進行中」と見なされます。

プロパティ
ApiVersionEOS_SESSIONS_ENDSESSION_API_LATEST
SessionNameセッションのローカル名

完了すると、成功/失敗を示す EOS_Sessions_EndSessionCallbackInfo データ構造体を使用する呼び出しを EOS_Sessions_OnEndSessionCallback 関数は受け取ります。成功すると、セッションは「進行中」と見なされなくなり、プレイヤーの参加が再び許可されます。セッションを終了しても、プレイヤーが除去されたり、セッションが破棄されたりすることありません。セッションは実質的に開始前の状態に戻り、プレイの再開を含む使用可能な状態になります。セッションを破棄する予定の場合、先に EOS_Sessions_EndSession を呼び出す必要はありません。

セッションを破棄する

セッションが不要になったら、EOS_Sessions_DestroySession を使用して破棄する必要があります。次の情報を含む EOS_Sessions_DestroySessionOptions データ構造体を使用して、この関数を呼び出します。

プロパティ
ApiVersionEOS_SESSIONS_DESTROYSESSION_API_LATEST
SessionName破棄するセッション名

破棄の処理が完了すると、EOS_Sessions_DestroySessionCallbackInfo データ構造体を使用して型 EOS_Sessions_OnDestroySessionCallback のコールバックを受け取ります。成功すると、セッションは存在しなくなり、その名前を再利用できるようになります。ただし、このシステムは非同期で動作するため、EOS_Sessions_DestroySession を呼び出してから、バックエンド サービスがセッションを破棄するまでに、プレイヤーが要求する可能性があります。この場合、破棄処理を開始した後に、セッションへの参加要求を受け取ることがあります。重要なのは、これらのプレイヤーを拒否する、またはネットワークをシャットダウンして、破棄するセッションに参加しないようにすることです。

リモート クライアントにセッション管理をミラーリングする

Sessions インターフェースでは、セッション オーナー (セッションを作成したユーザー) はバックエンド サービスに存在するため、セッションの状態を管理できます。セッションのライフサイクルは作成で始まり、破棄で終わります。これら 2 つのイベントの間に、Sessions インターフェースで実行できるのは、セッションの変更、プライバシー設定の変更、招待の送信、プレイヤーの参加時の登録/離脱時の登録削除、および対戦の開始/終了です。セッションのライフサイクルは厳格なものではなく、たとえば、いつでもセッションのデータを変更でき、複数の対戦を開始し終了できます。

一般に、セッションのオーナーだけがバックエンド サービスのセッション データを変更できます。ただし、セッションに 参加する リモート クライアントは、セッションのローカル ビューを独自に保持し、このビューでバックエンド バージョンのデータ更新を自動で受信しません。必須ではありませんが、次の関数呼び出しをミラーリングして、リモート クライアントで、バックエンド セッションとローカル ビューの同期を維持すると役に立ちます。

  • EOS_Sessions_StartSession

  • EOS_Sessions_EndSession

  • EOS_Sessions_RegisterPlayers

  • EOS_Sessions_UnregisterPlayers

これらの関数は、バックエンド サービスのバージョンに影響を与えることなく、リモート (オーナー以外) クライアントのセッションのローカル状態を変更します。

処罰を実行する

EOS Sanctions を使用している場合、プレイヤーが対象セッションに参加または登録しようとするときに、処罰を強制することができます。処罰の詳細については、Sanctions インターフェース のドキュメントを参照してください。

処罰対象プレイヤーは、処罰が有効であるセッションに参加も登録もできません。これにはプレイヤー自身が作成した処罰対応セッションも含まれますが、プレイヤー自身が処罰対象である場合は、セッションに参加できません。

処罰は Sessions インターフェースを通じて実行されます。処罰の実行は、EOS_Sessions_CreateSessionModificationOptions 構造体の bSanctionsEnabled メンバーの値に基づいて、セッション作成時に有効になります。bSanctionsEnabled が true の場合、作成されたセッションで処罰が実行されます。詳細については、「セッションを作成する」 セクションを参照してください。

プレイヤーが RESTRICT_GAME_ACCESS の処罰を受けている場合、Anti-Cheat で保護されているゲームでは自動的にマルチプレイヤー セッションから排除されます。詳細については、Anti-Cheat のドキュメントを参照してください。

EOS_Sessions_JoinSession 関数は、RESTRICT_MATCHMAKING の処罰を受けているプレイヤーを参加させず、参加しようとすると EOS_Sessions_PlayerSanctioned エラーを返します。ただし、EOS_Sessions_RegisterPlayers 関数は複数プレイヤーをサポートし、EOS_Sessions_JoinSession と異なり、処罰が有効であるセッションに、処罰プレイヤーが一人または複数登録を試みてもエラーを返しません。応答オブジェクトをチェックして、すべてのプレイヤーが登録されていることを確認する必要があります。セッションで処罰が有効である場合、登録できなかった処罰プレイヤーは、コールバック結果の EOS_Sessions_RegisterPlayersCallbackInfo 構造体の SanctionedPlayers メンバーにリストされます。詳細については、「プレイヤーを登録する」 を参照してください。

使用上の制限事項

Sessions インターフェースを通じて、ユーザーはオンライン ゲーミング セッションをホスト、検索、操作できます。ゲームを開始する前に一定数のプレイヤー スロットが埋まり、ゲーム終了後に解除する場合は、セッションが短くなることがあります。あるいは複数マップやレベルにわたって対戦を繰り返すゲームの経過を追跡する場合などは、長くなることもあります。Sessions インターフェースは、バックエンド サービスの検索およびマッチメイク機能をサポートする、ゲーム固有のデータも管理します。

スロットリング、使用量制限、ベストプラクティスに関する一般的な情報については、「サービス使用上の制限事項」を参照してください。

セッションには次の一般的な制限事項が適用されます。

機能制限事項
同時プレイヤー数1000/セッション
セッション属性数100/セッション
属性名の長さ1000 文字

Sessions インターフェースとのユーザー インタラクションでは次の制限事項を順守する必要があります。

機能制限事項デプロイメントごとの制限事項
セッションの作成30 リクエスト/分30 リクエスト/1 CCU/分
セッションの削除30 リクエスト/分30 リクエスト/1 CCU/分
セッションの更新30 リクエスト/分30 リクエスト/1 CCU/分
プレイヤーの追加/削除100 リクエスト/分30 リクエスト/1 CCU/分
セッションの開始/停止30 リクエスト/分30 リクエスト/1 CCU/分
ユーザーの招待100 リクエスト/分30 リクエスト/1 CCU/分
セッションのフィルタ30 リクエスト/分30 リクエスト/1 CCU/分

さらにユーザー単位のレートに制限があります。スロットリングを避けるため次の制限を検討します。

機能ユーザー制限
ユーザー 1 人が一度に参加できるセッション数16

マッチメイク セキュリティに関する考慮事項

マッチメイク 機能では、プレイヤー ID、サーバー IP アドレスなどの情報セットを取得し、そのデータを他の潜在ユーザーにブロードキャストすることが必要です。一般にセッション データは次の内容で構成されます。

  1. ホスト IP アドレスEOS_SessionModification_SetHostAddress を使用して設定または EOS サービスで自動的に検出します。ゲームに参加を試みるとき、このアドレスが必須になります。

  2. EOS 製品ユーザー ID (セッションに登録したすべてのプレイヤーに対する)

  3. カスタム属性、EOS_SessionModification_AddAttribute を使用してセッションに追加されたもの。デベロッパーが設定したものはすべてこれに該当します。

マッチメイクはゲーム データを受け取り、検索可能なインデックスを作成します。つまりセッションを作成するとき、公開対象データの種類を常に考慮する必要があります。専用サーバーを使用するゲームの場合、サーバーの IP アドレスを公開し、ピアツーピア (P2P) セッションの場合、エンドユーザーの IP アドレスを公開します。

:ホスト IP アドレスを公開することにセキュリティ上の懸念がある場合、EOS_SessionModification_SetHostAddress を使用して、ホスト アドレスを他のものに設定、P2P インターフェースを使用している場合は、P2P ソケット ID などを使用できます。

セッションを作成するとき、EOS_SessionModification_SetPermissionLevel を使用してセッションの 権限レベル を指定できます。セッションには次の 3 種類のセキュリティ レベルがあります。

セキュリティ レベル説明
EOS_OSPF_PublicAdvertisedセッションが開始されていない、あるいはセッションで途中参加が許可されている限り、どのクライアントも、セッション ID を知らない場合でも検索結果から対象セッションを取得し、セッション情報を読み込むことができます。ユニークなセッション ID にアクセスできるクライアント/プレイヤーは、セッションが参加可能ではない場合でも、セッション情報を見ることができます。登録プレイヤーがパブリック セッションにいる限り、プレイヤーは登録プレイヤーの ID を使用して、セッションを見つけることもできます。
EOS_OSPF_JoinViaPresenceユニークなセッション ID にアクセスできるクライアント/プレイヤーは、セッション情報を見ることができます (一般にこの情報はプレゼンス データ経由で共有されるが、他の方法でも共有可能)。
EOS_OSPF_InviteOnlyセッションの既存メンバーからセッションに明示的に招待されたプレイヤーのみがセッション情報を見ることができます。

ベスト プラクティス

  • セッションの公開範囲を必ず必要最小限に抑えます。

  • セッションを探しているすべてのメンバーには公開できない情報をセッション属性に追加しないでください。

  • JoinViaPresence を使用している場合は、プレイヤー/UI でセッション ID が必ず見えないようにします。これが公開されると、セッション データにアクセスできます。

  • ゲームで JoinInProgress がサポートされていない場合、必ずサーバーから EOS_Sessions_StartSession でセッションを開始し、ゲームが進行中にそれ以降の検索からそのセッションを除去します。

FAQ

Q:作成したばかりのサーバーがなぜ見つからないのですか?
A:インデックス処理がリフレッシュするのに 2 秒かかります。サーバーを作成した直後には表示されません。

Q:チームメンバーやフレンドと同じサーバー リストが表示されないのはなぜですか?
A:マッチメイクでは、同時に 2 人のユーザーが同じサーバー リストを取得しないように、2 秒の遅延があります。この煩わしさは意図的なもので、サーバーの効率に影響を及ぼす可能性がある競合状態を回避するためです。

Q:自分のゲームでセットアップしたセッションを確認したいと思います。ゲームのすべてのセッションをどのようにして表示できますか?
A:デベロッパー ポータルのゲーム セクションでセッションのリストを見つけられます。デベロッパー ポータル (dev.epicgames.com/portal) にサインインして、左のサイドバーにある [Products (製品)] セクションから対象製品を選択します。[Game Services (ゲームサービス)] > [MULTIPLAYER (マルチプレイヤー)] > [Matchmaking (マッチメイク)] に移動します。