シームレスな移動 / 非シームレスな移動
Unreal Engine (UE) の移動方法は主に 2 種類です。それは、シームレス と 非シームレス 移動です。主な違いは、シームレス 移動はノンブロッキング操作であるのに対し、非シームレス 移動はブロッキングコールで操作します。
クライアントで非シームレス移動を実行すると、このクライアントがサーバーと非接続状態になり、その後で新しいマップのロード準備が整った同一サーバーと再接続します。
Unreal Engine は、可能な限りマルチプレイヤー ゲームにシームレス移動の使用をお勧めします。通常、ゲーム体験が一層スムーズになり、再接続のプロセス中に発生しがちな問題を回避できます。
非シームレス移動を行う方法は以下の 3 通りがあります。
- 初回マップのロード時
- クライアントとして初めてサーバーと接続する時
- マルチプレイヤー ゲームを終了して新しいゲームを開始する時
移動は、UEngine::Browse
、 UWorld::ServerTravel
と APlayerController::ClientTravel
の 3 つの関数で操作します。どれを使用するかの判断は多少紛らわしいので、以下のガイドラインを判断基準にしてください。
UEngine::Browse
- 新しいマップをロード中にハードリセットをするようなものです。
-
結果はかならず非シームレス移動になります。
-
サーバーは目的マップへ移動する前に必ずクライアントと非接続状態になります。
-
クライアントは現行サーバーと非接続になります。
- デディケイテッド サーバーは他のサーバーへ移動できません。そのためローカル (URLではなく) マップでなくてはいけません。
UWorld::ServerTravel
-
サーバーのみです。
-
サーバーを新規ワールド / レベルへジャンプさせます。
-
接続中のすべてのクライアントはこれに従います。
-
これは、マルチプレイヤー ゲームがマップからマップへ移動する方法です。サーバーはこの関数の呼び出しを管理します。
-
サーバーは接続中のすべてのクライアントプレイヤーに
APlayerController::ClientTravel
を呼び出します。
APlayerController::ClientTravel
-
クライアントから呼び出されると、新規サーバーへ移動します。
-
サーバーから呼び出されると、特定のクライアントに対して新しいマップへの移動を指示します (ただし現行サーバーへは接続されたままです)。
シームレスな移動を有効にする
シームレス移動を有効にするには、トランジッションマップの設定が必要です。設定には UGameMapsSettings::TransitionMap
プロパティを使います。このプロパティはデフォルトでは空です。ゲームのこのプロパティを空のままで放置すると、トランジッションマップに空のマップが作成されます。
トランジッション マップが存在する理由は、ワールドを常にロードした状態でなければいけないため (マップを保持)、新しいマップをロードする前に以前のマップを解放できないからです。マップが非常に大きい場合もあるため、古いマップと新しいマップを同時にメモリに保存することはお勧めしません。ここでトランジッションマップが必要になります。
トランジッションマップを作成すると、現行マップからトランジッションマップへの移動が可能になります。そしてここから最終マップへ移動ができます。トランジッションマップはとても小さいため、現行および最終マップとオーバーラップ中に余分なオーバーヘッドは発生しません。
トランジッションマップを作成したら、 AGameMode::bUseSeamlessTravel
を true に設定します。これでシームレス移動が機能します!
シームレス移動のフロー
以下は、シームレス移動を実行時の一般的なフローです。
- トランジッション レベルに持続するアクタにマークを入れます。
- トランジッション レベルへ移動します。
- 最終レベルに持続するアクタにマークを入れます。
- 最終レベルへ移動します。
シームレス移動中のアクタの持続
シームレス移動を使用時に、現行レベルから新規レベルへ (持続する) アクタを引き継ぐことがあります。インベントリ アイテムやプレイヤーなど、特定のアクタにとって便利です。
これらのアクタはデフォルトで自動的に維持する設定になっています。
GameMode
アクタ (サーバーのみ)AGameModeBase::GetSeamlessTravelActorList
によってさらに追加されたアクタ
- すべてのコントローラーが有効な
PlayerState
(サーバーのみ) - すべての
PlayerControllers
(サーバーのみ) - すべてのローカル
PlayerControllers
(サーバーとクライアント)- ローカルの
PlayerControllers
で呼び出されたAPlayerController::GetSeamlessTravelActorList
によって追加されたアクタ
- ローカルの