マッチメイクとは、プレイヤーをセッションと対戦させるプロセスのことです。 セッションは基本的にサーバー上で、ゲームのプレイを希望するプレイヤーが見つけて参加できるようにする advertized か、あるいは招待または通知を受けたプレイヤーのみ参加できる private のいずれかの所定のプロパティ群によって実行されているゲームのインスタンスをいいます。
プレイ中のゲームを全てリストするオンライン ゲーム ロビーを思い描いてください。 リストにあるそれぞれのゲームがセッション、あるいは個々のオンライン対戦です。 プレイヤーは検索または別の方法でセッションを見つけて、それから対戦を行うセッションに参加します。
セッションの基本的なライフタイムは以下になります。
- Editor/UserGuide でマップを新規に作成する
- プレイヤーが対戦参加を要求してくるのを待つ
- 参加希望のプレイヤーを登録する
- セッションを開始する
- 対戦をプレイする
- セッションを終了する
- プレイヤーの登録を解除する
-
または:
- 対戦の種類を変更して参加するプレイヤーを待つ状態に戻る場合は、セッションを更新する
- セッションを破棄する
セッションインターフェース
セッションインターフェース は IOnlineSession
で、マッチメイクに加え、オンラインゲームを検索し参加するための他の方法を行うために必要な、シーンの裏側で構成要素を設定するためのプラットフォーム専用の機能を提供します。
これには、索や他の手段でセッションを探すだけでなく、そのようなセッションへの参加や退室などのセッション管理が含まれています。
セッションインターフェースが作成され、OnlineSubsystem に所有されます。
つまり、サーバー上にのみ存在するということです。
セッションインターフェース クラスはプラットフォームにつき 1 つです。 新規プラットフォームへのサポートを追加した場合、新しい種類のセッションインターフェースを作成しなければなりません。 ここで言うプラットフォームとは、ハードウェア プラットフォームのことを指します。 従って、1 度に存在するセッションは、エンジンが実行されているプラットフォーム用のセッションインターフェースの 1 つのみになります。
セッションインターフェースは処理中の全てのセッションを実行しますが、ゲームは通常セッションと直接インタラクトしません。
その代わり、ゲームセッション である AGameSession
はセッションインターフェースの周りでゲーム専用のラッパーの役目をし、セッションとの相互作用が必要なときにゲームコードが呼び出します。
ゲームセッションはゲームモード AGameModeBase
で作成および所有され、またオンラインゲームの実行時にはサーバー上にのみ存在します。
ゲームはそれぞれ複数のゲームセッションの種類をもつ可能性がありますが、 1 回につき 1 つしか使用されません。 ゲームが複数のゲームセッションの種類を持つ最も一般的なケースとしては、ゲームが専用サーバーを使用して、ゲームセッションの種類を追加する場合です。
セッションの設定
セッションの設定 は FOnlineSessionSettings
クラスで定義される、セッションの特性を決定するプロパティ群になります。
基本的な実施内容は、
- 可能プレイヤー数
- セッションの公開 / 非公開
- セッションは LAN 経由の対戦か
- デディケイテッド サーバーか、プレイヤー側のホストか
- 招待は可能か
- 他
オンラインゲームのロビーを例にすると、これらのそれぞれのゲームがセッションで、その 1 つ 1 つにセッション設定があります。 例えば、セッションの中にはプレイヤー対プレイヤー (PvP) のものもあれば、協力プレイモード (Co-Op) のものもあります。 別々のセッションをそれぞれ違うマップまたはプレイリストでプレイしたり、それぞれ異なるプレイヤー数を要求することができます。
セッション管理
セッションインターフェースの主な役割は、セッションの設定、更新、破棄などのセッション管理です。
セッションの作成
プレイヤーがセッションを見つけて参加するには、セッションを作成し、プロパティを設定するだけでなく、検索できるようにどのプロパティを表示させておくか決めなければなりません。
セッションは、新規セッションの設定に使うセッション群を受け取る IOnlineSession::CreateSession()
を使って作成されます。
セッションが作成されると、 OnCreateSessionComplete
デリゲートが発行されます。
セッションの更新
既存のセッションの設定を変更したい場合、IOnlineSession::UpdateSession()
関数を使ってセッションの更新を行います。
例えば、現在の設定ではプレイヤー数は 8 人となっていても、次の対戦では 12 名にしなくてはいけない場合があるかもしれません。
セッションを更新するためには、 UpdateSession()
を呼びだして最大プレイヤー数を 12 に指定する新しいセッション設定をパスします。
セッション更新要求が完了すると、 OnUpdateSessionComplete
デリゲートが発行されます。
これが、セッション設定の変更を処理に必要なコンフィギュレーションあるいは初期化を実行するきっかけとなります。
セッションの更新は通常サーバー上でマッチの間に実施されますが、セッション情報の同期を取るためにクライアント側でも行われます。
セッションの破棄
セッションが終了し、もう必要がない場合、 IOnlineSession::DestroySession()
関数を使って破棄します。
破棄操作が完了すると、 OnDestroySessionComplete
デリゲートが発行され、クリーンアップ操作の実施が可能になります。
マッチメイク - セッションの検索
オンライン サブシステムはセッションがアクティブになるまで、プレイヤーのマッチに必要な基本的なビルド ブロックを提供します。 特定の種類のマッチメイクのビルトインには基本的な実装がされていませんが、 マッチメイク サービスを備えているプラットフォーム上の実装は、これらのサービスへのアクセスを公開しています。 これは基本的に、プレイヤーが参加できるセッションを見つけるプロセスになります。 セションが見つかると、プレイヤーは セッションに参加 することができます。
セッションの検索
セッションを探す一番簡単な方法は、希望する設定のサブセットの幾つかに一致するセッションを探すことです。 従って、 ユーザーインターフェース (UI) でのプレイヤーがフィルター群を選択したり、あるいは プレイヤーのスキルや他の要因に基いて自動的に裏側で行ったり、 またはその両方で行うことができます。
セッションを探す最も基本的な形式は、利用可能なゲームをすべて表示し プレイしたゲームの種類に応じてプレイヤーはこれらにフィルターを適用し 基準を満たしているセッションの中から参加するものを 1 つ選択することができる形式です。
セッションを検索するには、 FOnlineSessionSearch
オブジェクトとして検索するために、 IOnlineSession::FindSessions()
をセション設定のリファレンスへパスします
セッションの設定値のリファレンスの SearchResults
メンバーは 一致しているセッションを入力します。
検索が完了すると、 OnFindSessionsComplete
デリゲートが発行されます。
このデリゲートから、検索結果をイタレーションすることができます。
クラウドベースのマッチメイク
クラウドベースのマッチメイクとは、ビルトインされたマッチメイク サービスで利用できるものを指し、一般的にはプラットフォーム専用になります。 Microsoft の Xbox Live サービスで使用できる TrueSkill システムが、この類のサービスの例です。
クラウドベースをサポートしているプラットフォームでマッチメイクを開始するには、IOnlineSession::Startmatchmaking()
を呼び出し、 マッチメイク対象のプレイヤーのコントローラー番号、セッション名、 新規セッションを作成する場合に使用するセッション設定、検索対象となる設定をパスします。
マッチメイクが完了すると、 OnMatchmakingComplete
デリゲートが発行されます。
これにより、プロセスが正常だったかどうかを指定する bool 、このケースでは参加するセッション名が設定されます。
進行中のマッチメイク処理は、 IOnlineSession::CancelMatchmaking()
が呼び出して、 プレイヤーのコントローラー番号と最初にマッチメイクを開始するためのコールにパスされたセッション名を渡すと、 キャンセルすることができます。
キャンセル操作が完了すると、 OnCancelMatchmakingComplete
デリゲートが発行されます。
友達のフォローと招待
友達のコンセプトをサポートしているプラットフォームで、プレイヤーは友達をセッションにフォローしたり、 友達をセッション参加へ招待することができます。
友達をセッションにフォローするには、 IOnlineSession:FindFriendSession()
を呼び出し、 セッションに参加希望のプレイヤー数と既にセッションにいる友達の ID をパスします。
重心は そこにセッションへ参加するために使用できる検索結果が含まれていると、OnFindFriendSessionComplete
が発行されます。
IOnlineSession:SendSessionInviteToFriend()
または IOnlineSession::SendSessionInviteToFriends()
を使って、 ローカル プレイヤー番号、セッション名 (複数可)、招待するプレイヤーの ID (複数可) をパスすると、 プレイヤーは現在のセッションに複数の友達を招待することもできます。
友達が招待を承諾すると、参加するセッションの検索結果が含まれた OnSessionUserInviteAccepted
デリゲートが発行されます。
(#joinsession)
セッションへの参加
プレイヤーが参加するセッションを決定したら、 IOnlineSession::JoinSession()
を呼び出してプレイヤー数と参加するセッションの検索結果を渡すと、参加プロセスが始まります。
参加プロセスが完了すると、 OnJoinSessionComplete
が発行されます。
プレイヤーをマッチに参加させるロジックはここで実行されます。
まず、マッチに参加するために必要な、プラットフォーム用の特別な接続情報を返す IOnlineSession::GetResolvedConnectString()
を呼び出す必要があります。
そしてこの関数でゲットした文字列は、プレイヤーをマッチに送るために、 APlayerController::ClientTravel()
あるいは UWorld::Servertravel()
にパスされます。