リプレイ
1.2.1.リリースにQuantumを使用したリプレイの保存と再生の方法を追加しました。
システムの全ての部分はコードのフォームをしています。
実装方法を確認してそのまま使用することも、自分のプロジェクトに合わせて少し調整して使用することもできます。
このページでは、変更されていないコンパイル済みのアプリケーションについて説明します。このコンパイル済みアプリケーションは、記録済みのセッションから全く同じ入力、ユーザー入力、ゲームアセットを使用してゲーム趣味レーションを再実行します。コンパイル済みアプリケーションは、必ずしも同一のものである必要も、同じプラットフォーム上(たとえばAndroid、Unityエディター、Windows exe、カスタムのゲームサーバー)で実行する必要もありませんが、同じQuantum DLLでビルドされている必要があります。予測性によって、再生されたゲームセッションは同じ結果を算出します。
コンパイル済のアプリケーションは、必ずしも同一のものである必要も、同じプラットフォーム上(例えばAndroid、Unityエディター、Windows exe、カスタムゲームサーバー)で実行する必要もありませんが、同じQuantum DLLでビルドされている必要があります。決定性のおかげで、再生されたゲームセッションは同じ結果が計算されます。
リプレイファイル
リプレイは以下の2つから構成されています。
- データベース: UnityのDBクラスからのQuantum静的ゲームアセット (quantum.state.csprojの、Core/Replay/DatabaseFile.csを参照してください。)
- セッション特有の設定ファイルと入力ストリーム (quantum.state.csprojの、Core/Replay/ReplayFile.csを参照してください。)
リプレイファイルを二つのファイルに分けました。
データベースがかなり大きく、ゲームバージョンごとに1ファイルしかリクエストされないからです。(例 リリース済みのゲームもしくはQAビルド)一方で、リプレイファイルはバージョンごとに多数もつことができます。
Unityでリプレイを実行する際はUnity DBがロードされますが、後からリプレイでデシリアライズされたデータベースと交換されます。
加えて、ReplayFileクラス内の全てのコンフィグも交換されます。

リプレイフォルダはこのようになります。Test_NavMeshUnity.bytesファイルがあります。

SciptableObjectのサイズ制限により、navmeshアセット(NavMesh:AssetObject
を参照してください)から実際のnavmeshデータを抽出する必要があります。データベースが格納されているのがフォルダであって、1つのファイルになっていないのはこのためです。利便性のため、リプレイファイルも同じフォルダ内に配置されています。
Unityでリプレイを開始する時、FileLoader(Unityリソースなどの異なるプラットフォームや環境においてQuantumコードの内側からファイルを検索する)が、パスのオフセットを使用してどのように初期化されデータベースフォルダをポイントしているか、以下を確認してください。
C#
Quantum.FileLoader.Init(new Quantum.UnityFileLoader(DatabasePath));
リプレイファイルフォーマット
データベースをJSONに、リプレイファイルをJSONもしくはBSONに保管しました。
開発の間は常に人間に読める形式のファイルになっており、サイズはここではあまり関係ありません。例えば、MBアタッチメントのあるQAチケットなどです。
その一方でリプレイファイルは任意でBSONに保管することもできます。そうすると、サイズは既に縮小されていますがそれでもまだリリース可能にするには十分ではありません。入力がフレームからフレームへ見た目がかなり似通っているバイナリブロブなので、ここでは圧縮が効果的です。
アセットストアからプロジェクトに、デフォルトの JSON .NET For Unity パッケージを追加します。既にプロジェクト内にパッケージがある場合は、一つ削除してください。 JSON.net dllもPUNパッケージから手動で削除する必要がありました。
リプレイキャプチャリングの設定
QuantumRunnerLocalDebugを使用して直接ゲームシーンを実行している場合、インスペクター内で RuntimeConfig の RecordingFlags が Default
もしくは少なくともInput
になっているようにしてください。
Quantumサンプルメニューシーン経由などでオンラインでゲームを実行している場合、動的にRuntimeConfigが作成されており、RecordingFlagsがそこに追加されています。(例:UIRoom.CheckForGameStart())
リプレイの保存
Unityエディターでリプレイメニューアイテムを使用できるようになりました。(下記のスクリーンショットを参照してください。プレイモードでのみ使用可能です。)
1つのリプレイは、1つのフォルダに格納された複数のファイルで構成されています(リプレイファイルのセクションを参照してください)。
リプレイをアプリケーションビルド内で実行する場合は、リプレイフォルダはリソースフォルダ内に格納されている必要があります。

QuantumSimpleReplaySaverスクリプトの使用およびゲームシーンへの追加も可能です。このスクリプトは、アプリケーションビルド内のリプレイの補間を、スタンドアロンでAltGr+R、モバイルでは3回指でタッチすることで可能にします。リプレイはAppData(Unity PersistentDataFolder)に保存されます。
リプレイの保存に関しては、自分の好きな方法を作成できます。
リプレイAPI
関連するリプレイ方法の多くはQuantumGameクラスにあります。以下を参照してください。
C#
public class QuantumGame : IDeterministicGame {
public InputProvider RecordedInputs { get; }
public ChecksumFile RecordedChecksums { get; }
public static void ExportDatabase(Stream stream, IReplaySerializer serializer, string folderpath, int navmeshSerializationBuffer);
public static void ExportRecordedChecksums(QuantumGame game, Stream stream, IReplaySerializer serializer);
public static void ExportRecordedReplay(QuantumGame game, Stream stream, IReplaySerializer serializer);
public ReplayFile GetRecordedReplay();
public Frame GetRecordedSnapshot(int frame);
public void StartRecordingChecksums();
public void StartRecordingInput();
public void StartRecordingSnapshots(float bufferSizeSec, int snapshotFrequencyPerSec);
public void StartVerifyingChecksums(ChecksumFile checksums);
}
リプレイを再生する
QuantumRunnerLocalDebugスクリプトに似てはいるものの、開始に必要な全てのアクションとリプレイの実行をローカルでおこなうスクリプト、QuantumRunnerLocalReplay があります。
- QuantumRunnerLocalDebug スクリプトが配置されている、同じゲームオブジェクトにuantumRunnerLocalReplayスクリプトを追加します。
- ゲームの開始時に2つのスクリプトのうち、 1つだけ有効にします。
- リプレイランナースクリプト上にreplay.jsonもしくはreplay.bytesファイルをドラッグアンドドロップします。
- 同じフォルダ内にデータベースファイルがある場合、他のものもすべて自動的に書き込まれます。
- 同じフォルダ内にデータベースファイルがない場合は、同じように使いたいデータベースファイルをスクリプト上にドラッグしてください。
- チェックサムファイルを追加すると、リプレイされたフレームが検証されます(任意)。

QuantumRunnerLocalReplayスクリプトをよく見て、クライアント上のリプレイの実行にリプレイAPIを使用するため必要な全ての情報を探してください。
コンソールランナー
Quantum 1.2.2では、quantum_code.slnに quantum.console.runner プロジェクトを追加できます。

スタートアッププロジェクトとして選択すると、Unityを使うことなく、受け渡されたリプレイファイルを使用して、F5を押せばQuantumシミュレーションをデバッグできるようになります。以下を参照してください。
console.runner.exe [folder path to LUT files] [file path to database] [file path to replay] ([file path to checksums])
プロジェクトはデバッグモードで既に以下のパスを設定しています。
../../../../quantum_unity/Assets/Quantum/Resources/LUT
../../../../quantum_unity/Assets/Resources/Replays/replay/db.json
../../../../quantum_unity/Assets/Resources/Replays/replay/replay.json
../../../../quantum_unity/Assets/Resources/replay/checksum.json
チェックサムファイルを受け渡すとき、検証エラーにひっかかる可能性があります。Unityで記録されたチェックサムはランナーで生成されたチェックサムとは互換性がありません。DeterministicConfigでChecksumCrossPlatformDeterminism
を有効にしてからもう一度リプレイを記録してエラーを訂正するか、チェックサムファイルの受け渡しをやめるかしてください。
コンソールランナーでは以下を使用することに留意してください。
- assemblies フォルダのQuantum DLL (PhotonDeterministic、core)
- Unity pluginsフォルダ のQuantumゲームDLL(ステート、システム)(つまり、プロジェクトのレイアウトを変更したり、quantum_unityフォルダの名前を変更した場合は、csプロジェクト内のリファレンスのリンクをアップデートしておく必要があります)
- Newtonsoft.Json NuGet パッケージ