動的アセットの注入
概要
Asset Injection アドオンは Quantum SDK 上に構築されたユーティリティのセットで、シミュレーション中に Quantum の動的データベースにアセット(Map、EntityPrototype、...)を決定論的に追加することができます。
Asset Injection アドオンは、リファレンス実装を含む通常のプロジェクトです。ユーティリティスクリプトは、Quantum 2.1以降を使用するすべてのプロジェクトで使用することができます。
備考:
- データベースに注入されるアセットは、実行時に作成することができます(たとえば、プレイヤーによって作成されたマップなど)。
- 動的データベースはゲーム状態の一部であり、スナップショットの一部として後発参加者に転送されます。したがって、後発参加者のために同期化コードを追加する必要はありません。
ダウンロード
バージョン | リリース日 | ダウンロード | |||
---|---|---|---|---|---|
2.1.0 | 2023年5月11日 | Quantum asset-injection 2.1.0 Build 196 |
Quantum
アドオンの Quantum 側では、アセットの圧縮、アセット注入コマンドの定義、およびシステムがアセットを受け取り、ダイナミックデータベースに注入することを処理します。
圧縮
Quantumの内蔵圧縮ユーティリティは、注入されたデータの圧縮に使用され、コマンドで送信されるデータ量を削減するために使用されます。これは自動的に行われます。
InjectAssetCommand
InjectAssetCommand
は他のプレイヤーとデータを決定論的に共有するために使用されます。1つのコマンドは最大4kBまでのデータを保持することができます。データがこの制限を超えた場合、アセットは自動的に複数の小さなチャンクに分割され、複数のコマンドで送信されます。コマンドはサーバーによって特定のものに付けられます。そのため、シミュレーションのフレームごとに1つのコマンドしか受け取ることができません。このため、シミュレーションはコマンドが分割された量に等しいティック数だけ待機する必要があり、遅延が発生します。
InjectionSystem
InjectAssetSystem
は InjectAssetCommands
を処理し、Quantum のダイナミックデータベースにアセットを注入します。アセットが複数のコマンドで送信された場合、 InjectAssetSystem
はそれぞれの部分コマンドのデータチャンクを保存します。すべての部分が受信されると、アセットが再集合され、データベースに注入されます。
Unity
Unity側では、Commandの送信方法を示しています。
コマンドによるアセット送信
AssetInjectionUtility
は、シミュレーションの動的データベースに注入されることを意図した、あらゆるタイプの Quantum アセットを送信するために使用されます。必要なパラメータを指定して InjectAsset()
メソッドを呼び出すだけで、後は AssetInjectionUtility
が処理します。必要であれば、大きなデータを複数のコマンドに分割して処理することもできます。
C#
public static void InjectAsset(QuantumGame game, PlayerRef player, string assetName, byte[] data);
特別なアセット
Quantumを使用する際によく使われる特殊なアセットとして、MapとEntity Prototypesのアセットがあります。これらのタイプのアセットのシリアライズとデシリアライズを容易にするために、2つの追加ユーティリティが提供されています。
MapUtlity
は、Simulation のアセットから Unity のアセットを作成するために使用されます。PrototypeUtility
は、エンティティプロトタイプをシリアライズ/デシリアライズするために使用されます。
これらのユーティリティは、例えば、ユーザー生成コンテンツとして作成されたエンティティプロトタイプを処理するために使用することができます。
アセットの注入ができるのは誰ですか?
一般的に、誰でも InjectAssetCommand
を送信して、データベースにあらゆる種類のアセットを注入することができます。アドオンパッケージで提供されている例では、誰でもマップアセットを注入できますが、特定のプレイヤーだけが新しいマップを_activate_することができます。
もし注入や注入されたアセットの操作を何らかの形で制限する必要がある場合、注入を許可されたプレイヤーは、シミュレーション内で決定論的に識別されなければなりません。例えば、各プレイヤーの RuntimePlayer
にフラグを設定し、ダイナミックデータベースのアセットを注入、または操作することを許可するかどうかを指定することができます。
決定論的に生成されたアセットを注入する
Quantum内部のシードから決定論的に生成されたマップなど、決定論的に生成されたアセットの場合、コマンドで送信せずにシミュレーション内から直接DBにインジェクトすることが可能です。
既知の制限事項
アセットに他のアセットへの参照が含まれている場合 (そのアセットがまだ DB に存在しない場合)、参照先のアセットも注入する必要があります。ユースケースによっては、参照するアセットがそれを参照するアセットより先にインジェクトされなければならない。
Back to top