Unreal Engine (UE) には、後で見るためにゲームプレイを記録できる リプレイ システムがあります。専用サーバーでプレイされるライブ、マルチプレイヤー ゲームから、シングルプレイヤー ゲームまで、さらには Play-In-Editor セッションでも、すべてのゲームで利用可能な機能です。簡単に説明すると、リプレイ システムは DemoNetDriver
を使ってビルトインのレプリケーション システムからのデータを読み出すことで機能します。NetDriver
で、ネットワーク環境でライブ ゲームプレイ環境が機能するのと似ています。実際にはマルチプレイヤー モードがなくても、マルチプレイヤー ゲームのようにデータをレプリケートするようにセットアップされたプロジェクトは、修正をしなくてもリプレイ システムと互換性があります。
これは、DemoNetDriver
がレプリケートされたデータを Replay Streamer に渡すことで機能します。Replay Streamer ではデータのフィルタリングと保存を処理します。リプレイを見る場合、DemoNetDriver
がライブ プレイ中に利用可能であったすべてのレプリケートされた情報 (リプレイのみに関連するとして指定された特殊なデータフィールド) にアクセスし、こうしたデータからゲームのイベントを再構築することができます。
リプレイ システムの機能
リプレイ システムの基本機能としては、デモの記録の開始や終了、または過去に記録されたデモの再生があります。再生モード中は、リプレイ システムは一時停止、再生速度を変更し、特定の時点にジャンプするコマンドをサポートします。システムの詳細な使用方法として、リプレイにテキスト タグ (通常はメタ タグまたはゲームに参加するプレイヤー名) を追加、テキスト タグやバージョン情報に基づき既存のリプレイにクエリーするなどがあります。リプレイ システムは C++ コードから使用できます。主に、UGameInstance
クラスおよび UWorld
クラス経由で、またはコンソール コマンドやコマンドライン引数を使って使用できます。
関数または変数名 | 同等のコンソール コマンド | 効果 |
---|---|---|
UGameInstance::StartRecordingReplay |
"demorec (ReplayName)" | リプレイの記録を開始します。(ReplayName) パラメータを指定しないとリプレイ システムは独自に名前を生成します。 |
UGameInstance::StopRecordingReplay |
"demostop" | 現在記録中のリプレイを停止します。 |
UGameInstance::PlayReplay |
"demoplay (ReplayName)" | 指定したリプレイを再生します。 |
UDemoNetDriver::GotoTimeInSeconds |
"demoscrub (ReplayTime)" | リプレイで指定された時間 (秒単位) にジャンプします。 |
UWorld::Pauser (variable) |
"demopause" | World の DemoNetDriver->ServerConnection は OwningActor 変数があります。Pauser をその値に設定するとリプレイが一時停止します。NULL に設定しなおすとリプレイが再開します。"demopause" コンソール コマンドはその変数を自動的に設定またはクリアします。 |
WorldSettings->DemoPlayTimeDilation (variable) |
"demospeed (ReplaySpeed)" | 時間 - スケーリングの係数を設定して再生速度を速めたり遅くしたりします。値 0.1 は通常の速さです。 |
AGameMode::bHandleDedicatedServerReplays (variable) |
N/A | この変数を true に設定すると、専用サーバーが自動的にゲームを記録します。 |
DemoNetDriver と Streamers
DemoNetDriver
は、Streamers へリプリケートされたデータをパスする特別なネットワーク ドライバーで、後で再生するための情報を記録されます。DemoNetDriver
の機能、ストリーマーの詳細については、「DemoNetDriver とストリーマー」を参照してください。
後方互換性
リプレイ システムではバージョン 4.13 から後方互換性がサポートされています。ビルドに修正を加えることができることを意味します。すなわち、レプリケートされたプロパティを追加、削除しても、オリジナルのビルドで記録したリプレイをロードしたり、表示したりすることができます。ほとんどの場合、これは自動的に処理されます。リプレイ システムは、取り除かれた古いレプリケートされた入力フィールドをスキップするか、追加した新規にレプリケートされた入力フィールドに対してデフォルトを使用するからです。NetSerialize
がオーバーライドされた構造体では、こうしたデータ形式の違いを手作業で処理する必要があります。
この目的上、FArchive
には、EngineNetVer
関数と GameNetVer
関数があります。これらは、エンジンとゲームのバージョンをそれぞれ特定し、現在のビルドに合うようにリプレイ データを調整することができます。FNetworkVersion
にあるデリゲート、GetLocalNetworkVersionOverride
は選択したものの uint32
バージョン番号を戻します。互換性が正確にマッチしなくてもよい場合、FNetworkVersion
には IsNetworkCompatibleOverride
と呼ばれるデリゲートがあり、2 つのバージョン番号間の比較を行うようにオーバーライドして、互換性があるかどうかを判断します。