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
) を取得します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_COPYACTIVESESSIONHANDLE_API_LATEST |
SessionName | セッション ハンドルを取得する対象セッションの名前 |
このハンドルを使用して、EOS_ActiveSession_CopyInfo
を呼び出せます。次のとおり EOS_ActiveSession_CopyInfoOptions
を初期化して渡す必要もあります。
プロパティ | 値 |
---|---|
ApiVersion | EOS_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
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONDETAILS_COPYINFO_API_LATEST |
成功すると、セッションの EOS_SessionDetails_Info
のコピーが返ります。そこに含まれるのは、セッションの ID、ホストのアドレス、セッションの空きスロット数です。この情報が不要になったら、EOS_SessionDetails_Info_Release
を呼び出して解放します。
セッションを作成する
セッションの作成は 2 段階のプロセスです。
まず、EOS_Sessions_CreateSessionModification
関数で、セッションの初期状態と設定をローカルに指定します。次の情報を含む EOS_Sessions_CreateSessionModificationOptions
構造体を渡す必要があります。
プロパティ | 値 |
---|---|
ApiVersion | EOS_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
を呼び出すことで、作成プロセスを完了できます。
プロパティ | 値 |
---|---|
ApiVersion | EOS_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
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_ACTIVESESSION_GETREGISTEREDPLAYERCOUNT_API_LATEST |
登録プレイヤーごとに製品ユーザー ID にアクセスする
アクティブ セッションに対して登録プレイヤーをイテレートして、各登録プレイヤーの製品ユーザー ID (PUID) を取得します。これを実行するには、次の情報を含む ActiveSessionGetRegisteredPlayerByIndexOptions
構造体を指定して、EOS_ActiveSession_GetRegisteredPlayerByIndex
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_ACTIVESESSION_GETREGISTEREDPLAYERBYINDEX_API_LATEST |
PlayerIndex | 取得する登録プレイヤーのインデックス。 |
成功すると、アクティブ セッションの指定したインデックスに対する、プレイヤーの製品ユーザー ID (PUID) が返ります。
セッションを変更する
既存のセッションを変更するには、デフォルトの EOS_HSessionModification
オブジェクトへのポインタ、および次のとおり初期化した EOS_Sessions_UpdateSessionModificationOptions
構造体を指定して、まず EOS_Sessions_UpdateSessionModification
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_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_SessionModification_AddAttribute |
カスタム属性 (型 EOS_SessionDetails_AttributeData ) をセッションに追加します。詳細については、「カスタム属性」 セクションを参照してください。 |
EOS_SessionModification_RemoveAttribute |
カスタム属性をセッションから除去します。詳細については、「カスタム属性」 セクションを参照してください。 |
セッションをローカルで変更した後、セッション オーナーである場合は、バックエンド サービスでそのセッションを更新できます。これを実行するには、次の情報を含む EOS_Sessions_UpdateSessionOptions
を指定して EOS_Sessions_UpdateSession
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_UPDATESESSION_API_LATEST |
SessionModificationHandle | サーバーが作成または更新するセッションのハンドル (EOS_HSessionModification ) |
この処理は、完了すると、EOS_Sessions_UpdateSessionCallbackInfo
データ構造体を指定して、EOS_Sessions_OnUpdateSessionCallback
型のコールバック関数を呼び出します。
カスタム属性
セッションにはユーザー定義データ (つまり 属性 ) を含めることができます。各属性には、文字列キーとして機能する「名前」、値の型を識別する列挙型変数である「値」、可視性設定があります。次の変数型が現在サポートされています。
EOS_ESessionAttributeType | 値の型 |
---|---|
EOS_SAT_BOOLEAN | EOS_Bool |
EOS_SAT_INT64 | int64_t |
EOS_SAT_DOUBLE | double |
EOS_SAT_STRING | const char* (null が終端の UTF8 文字列) |
次の可視性タイプを使用できます。
EOS_ESessionAttributeAdvertisementType | 可視性 |
---|---|
EOS_SAAT_DontAdvertise | 他のユーザーに表示されない |
EOS_SAAT_Advertise | 他のユーザーに表示される |
属性にアクセスする
有効な EOS_HSessionDetails
ハンドルと次の情報を含む EOS_SessionDetails_CopySessionAttributeByIndexOptions
を指定して EOS_SessionDetails_GetSessionAttributeCount
を呼び出すことにより、セッションにある属性数を確認できます。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONDETAILS_GETSESSIONATTRIBUTECOUNT_API_LATEST |
属性のコピーを取得するには、有効な EOS_HSessionDetails
ハンドルと次のとおり初期化された EOS_SessionDetails_CopySessionAttributeByIndexOptions
を指定して、EOS_SessionDetails_CopySessionAttributeByIndex
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONDETAILS_COPYSESSIONATTRIBUTEBYINDEX_API_LATEST |
AttrIndex | コピーする属性のインデックス |
成功すると、EOS_Success
が返り、出力パラメータに、要求した属性インデックスに対応する EOS_SessionDetails_Attribute
構造体のコピーが含まれます。この構造体には、EOS_Sessions_AttributeData
データ構造体にある属性の値と型、および EOS_ESessionAttributeAdvertisementType
列挙値の可視性が含まれます。このデータが不要になったら、EOS_SessionDetails_Attribute_Release
で解放します。
属性を追加する
EOS_Sessions_AttributeData
データ構造体に次の情報を入力することで、追加または変更する属性を設定できます。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_SESSIONATTRIBUTEDATA_API_LATEST |
Key | 属性の名前 |
Value | 属性の値またはポインタ (文字列の場合) |
ValueType | Value を説明する EOS_ESessionAttributeType |
このデータの準備ができたら、EOS_SessionModification_AddAttribute
を呼び出して属性を追加します。EOS_HSessionModification
ハンドルと次のとおり初期化された EOS_SessionModification_AddAttributeOptions
を指定する必要があります。
プロパティ | 値 |
---|---|
ApiVersion | EOS_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
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONMODIFICATION_REMOVEATTRIBUTE_API_LATEST |
Key | 除去する属性の名前 (キー) |
この関数で設定するのは、特定の属性が除去する対象であることだけです。実際にこの属性を除去する、またはセッションとやり取りすることはまったくありません。この セクション の冒頭で説明したように、EOS_Sessions_UpdateSession
を呼び出す必要がいずれにしてもあります。
プレイヤーをセッションに招待する
アクティブ セッションに参加するように別のプレイヤーを招待するために、セッションの 登録 メンバーは、次のデータを含む EOS_Sessions_SendInviteOptions
構造体を指定して EOS_Sessions_SendInvite
を呼び出すことができます。
プロパティ | 値 |
---|---|
ApiVersion | EOS_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
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_QUERYINVITES_API_LATEST |
LocalUserId | 招待が要求されているユーザー |
この処理は非同期です。終了すると、EOS_Sessions_QueryInvitesCallbackInfo
データ構造体を指定して、型 EOS_Sessions_OnQueryInvitesCallback
のコールバック関数を呼び出します。成功すると、EOS は対象ユーザーの保留中の招待すべてをローカルにキャッシュします。EOS_Sessions_GetInviteCount
を使用して、キャッシュ内の招待数を特定できます。次の情報が入った EOS_Sessions_GetInviteCountOptions
構造体を渡します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_GETINVITECOUNT_API_LATEST |
LocalUserId | 招待がキャッシュされたローカル ユーザー |
この関数はローカルに実行され、現在キャッシュ内にある招待数を表す uint32_t
を返します。キャッシュされた招待の ID を取得するには、次の情報を含む EOS_Sessions_GetInviteIdByIndexOptions
を指定して EOS_Sessions_GetInviteIdByIndex
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_GETINVITEIDBYINDEX_API_LATEST |
LocalUserId | 招待がキャッシュされたローカル ユーザー |
Index | 取得する ID に対する招待のキャッシュ インデックス |
EOS_Sessions_GetInviteIdByIndex
が EOS_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
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_REJECTINVITE |
LocalUserId | 招待を拒否するローカル ユーザー |
InviteId | 招待の ID |
完了すると、成功/失敗を示す EOS_Sessions_RejectInviteCallbackInfo
データ構造体を含む EOS_Sessions_OnRejectInviteCallback
コールバック関数の呼び出しを受け取ります。招待の拒否に成功すると、招待がシステムから完全に削除されます。
リモート セッションを検出する
リモート セッションを検出するには、検索を設定し、その検索を実行して、結果を調べる必要があります。
検索を設定する
検索を始めるには、まず EOS_Sessions_CreateSessionSearch
を呼び出し、検索ハンドルを作成します。次のとおり初期化した、EOS_Sessions_CreateSessionSearchOptions
構造体を渡します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_CREATESESSIONSEARCH_API_LATEST |
MaxSearchResults | 返される検索結果の最大数。 |
この関数はローカルで実行され、成功時にデフォルトの検索ハンドル (型 EOS_HSessionSearch
) が入ります。次のステップは、ハンドルを設定して、必要とする基準で特定の検索を実行することです。EOS では、セッションの検索に次の 3 種類の方法が用意されています。
-
セッション ID: 既知の ID で単一のセッションを検索する
-
ユーザー ID: 既知のユーザーに関連するすべてのセッションを検索する — 現在はローカル ユーザーに限定
-
属性データ: ユーザー定義のフィルタ基準のいずれかに一致するすべてのセッションを検索する
セッション ID を設定する
特定のセッションが必要で、そのサーバー側 ID がわかっている場合は、検索ハンドルと次のとおり初期化した EOS_SessionSearch_SetSessionIdOptions
を指定して、EOS_SessionSearch_SetSessionId
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONSEARCH_SETSESSIONID_API_LATEST |
SessionId | 検索するセッションの ID |
これはセッション ID 検索を設定するために必要な唯一のステップです。他の検索方法と異なり、この方法では複数の結果が返ることはありません。
EOS_OSPF_PublicAdvertised
または EOS_OSPF_JoinViaPresence
とマークされたセッションのみがこの方法で見つかります。
ユーザー ID を設定する
既知のユーザーに関わるすべてのセッションを見つけるには、検索ハンドルと次の情報を含む EOS_SessionSearch_SetTargetUserIdOptions
を指定して、EOS_SessionSearch_SetTargetUserId
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONSEARCH_SETTARGETUSERID_API_LATEST |
TargetUserId | セッション内で検索するユーザー ID |
これはユーザー ID 検索を設定するために必要な唯一のステップです。ローカル ログインユーザーであることが必要です。
アプリケーションはローカルに認証されたユーザーまたはパブリック セッションに登録されたリモート ユーザーのみを検索できます。
属性データを設定する
セッションを見つける最も堅実な方法は、フィルタとして機能する、一連の検索パラメータを基に検索することです。特定のゲーム タイプやマップをユーザーが選択できるようにするなど、一部のパラメータをそのユーザーに公開できますが、適切な対戦相手との対戦を見つけるために、プレイヤーの推定スキル レベルを使用するときなど、他のパラメータは公開しないことがあります。この検索方法では、複数のパラメータを使用することができ、すべてに該当するセッションのみを見つけます。検索パラメータを設定するには、検索ハンドルと次の情報を含む EOS_SessionSearch_SetParameterOptions
を指定して、EOS_SessionSearch_SetParameter
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_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_GetSearchResultCount
と
EOS_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
ハンドルがある場合に、既存のセッションに参加できます。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_JOINSESSION_API_LATEST |
SessionName | ローカル システムがセッションを参照するために使用するユニークな名前 |
SessionHandle | 参加するセッションの EOS_HSessionDetails ハンドル |
LocalUserId | セッションに参加するローカル ユーザー |
bPresenceEnabled | このセッションがローカル ユーザーのプレゼンス情報に関連付けられたものかどうか (詳細については、プレゼンス インターフェース を参照) |
処理が終了すると、型 EOS_Sessions_OnJoinSessionCallback
のコールバック関数は、成功/失敗を示す EOS_Sessions_JoinSessionCallbackInfo
を受け取ります。処理が成功すると、EOS は参加するクライアントのシステムにアクティブ セッションを作成します。この新しいセッションはローカルで所有されているため、参加するユーザーは、不要になったときに、セッションを 破棄する 必要があります。
プレイヤーを登録する
プレイヤーがセッションに参加するとき、セッション オーナーは、プレイヤーをセッションに登録する責任があります。これにより、バックエンド サービスはプレイヤー数を常に把握できるため、満員になったときに、セッションのアドバタイズを停止できます。EOS では、EOS_Sessions_RegisterPlayers
関数を通じて、一度に複数のプレイヤーの登録を受け付けます。次のデータを含む EOS_Sessions_RegisterPlayersOptions
構造体を使用して、所有しているクライアントからこの関数を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_REGISTERPLAYERS_API_LATEST |
SessionName | セッションのローカル名 |
PlayersToRegister | 参加するプレイヤーの ID の配列 |
PlayersToRegisterCount | PlayersToRegister の要素数 |
完了すると、型 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
構造体を使用して、所有しているクライアントからこの関数を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_UNREGISTERPLAYERS_API_LATEST |
SessionName | セッションのローカル名 |
PlayersToUnregister | 離脱するプレイヤーの ID の配列 |
PlayersToUnregisterCount | PlayersToUnregister の要素数 |
完了すると、型 EOS_Sessions_OnUnregisterPlayersCallback
の呼び出しは、成功/失敗を示す EOS_Sessions_UnregisterPlayersCallbackInfo
パラメータで実行されます。呼び出しが成功すると、バックエンド サービスは、プレイヤーが最初に登録したときに受けとったセッション管理アクセスを取り消します。たとえば、セッションに登録されていないプレイヤーは他のユーザーが参加するようにセッションに招待できません。EOS はプレイヤーがセッションから離脱することを通知しません。つまりセッションから離脱するときに、オーナーに通知するか、プレイヤーがゲームを離れた、または接続が切れたことを検出する方法をオーナーに用意する必要があります。
ホスト移行はセッションに対してサポートされていません。セッションのオーナーが離れる、またはネットワークへの接続を失うと、セッションは孤立し、バックエンドで誰もこのセッションを管理できません。
プレイを開始および終了する
プレイヤーはローカルのアクティブ セッションで対戦が開始または終了したことを宣言できます。ローカル プレイヤーが所有するバックエンド サービスのセッションに対象セッションがマップされている場合、バックエンド バージョンでもプレイを開始または終了します。プレイ中に、対象セッションで Join in Progress (途中参加) が無効になっている場合、バックエンド サービスはセッションへの参加を自動的に拒否します (詳細については、セッションを変更する のセクションを参照)。通常、セッションの開始は、対戦が始まったことを示していますが、この機能の個別の使い方はゲームのデベロッパーに任されています。
プレイを開始するには、次のとおり初期化された EOS_Sessions_StartSessionOptions
を指定して EOS_Sessions_StartSession
を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_STARTSESSION_API_LATEST |
SessionName | セッションのローカル名 |
処理が完了したら、型 EOS_Sessions_OnStartSessionCallback
のコールバック関数は、成功/失敗を示す EOS_Sessions_StartSessionCallbackInfo
データ構造体を使用して実行します。処理が成功すると、次の情報を含む EOS_Sessions_EndSessionOptions
で EOS_Sessions_EndSession
を呼び出すことで、プレイを終了するまで、セッションは「進行中」と見なされます。
プロパティ | 値 |
---|---|
ApiVersion | EOS_SESSIONS_ENDSESSION_API_LATEST |
SessionName | セッションのローカル名 |
完了すると、成功/失敗を示す EOS_Sessions_EndSessionCallbackInfo
データ構造体を使用する呼び出しを EOS_Sessions_OnEndSessionCallback
関数は受け取ります。成功すると、セッションは「進行中」と見なされなくなり、プレイヤーの参加が再び許可されます。セッションを終了しても、プレイヤーが除去されたり、セッションが破棄されたりすることありません。セッションは実質的に開始前の状態に戻り、プレイの再開を含む使用可能な状態になります。セッションを破棄する予定の場合、先に EOS_Sessions_EndSession
を呼び出す必要はありません。
セッションを破棄する
セッションが不要になったら、EOS_Sessions_DestroySession
を使用して破棄する必要があります。次の情報を含む EOS_Sessions_DestroySessionOptions
データ構造体を使用して、この関数を呼び出します。
プロパティ | 値 |
---|---|
ApiVersion | EOS_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 アドレスなどの情報セットを取得し、そのデータを他の潜在ユーザーにブロードキャストすることが必要です。一般にセッション データは次の内容で構成されます。
-
ホスト IP アドレス、
EOS_SessionModification_SetHostAddress
を使用して設定または EOS サービスで自動的に検出します。ゲームに参加を試みるとき、このアドレスが必須になります。 -
EOS 製品ユーザー ID (セッションに登録したすべてのプレイヤーに対する)
-
カスタム属性、
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 (マッチメイク)] に移動します。