エンティティプロトタイプ
はじめに
データ駆動設計を促進するために、Quantumはエンティティプロトタイプを特徴としています。
Quantumエンティティプロトタイプは、以下を含むエンティティのシリアライズされたバージョンです。
- 構成(つまり、どのコンポーネントから構成されているか);
- データ(つまり、コンポーネントのプロパティとその初期値)。
これにより、データと振る舞いの明確な分離が可能になり、デザイナーはプログラマーが常に振る舞いを編集することなく、データの調整を行うことができます。
プロトタイプの設定
エンティティプロトタイプはUnity Editorで設定できます。
基本
プロトタイプを作成するには、任意のGameObjectにQuantumEntityPrototype
コンポーネントを追加します。
![Entity Prototype Script on an empty GameObjet](/docs/img/quantum/v3/manual/entityprototype-basic.png)
QuantumEntityPrototype
スクリプトは、2Dおよび3Dの両方で最も一般的に使用されるコンポーネントのパラメータを設定し、定義することを可能にします。
- Transform(2D用のTransform2DVerticalを含む);
- PhysicsCollider;
- PhysicsBody;
- NavMeshPathFinder;
- NavMeshSteeringAgent;
- NavMeshAvoidanceAgent。
物理およびNavMesh関連のエージェントの依存関係は尊重されます。
詳細については、それぞれのドキュメントを参照してください。
カスタムコンポーネント
エンティティプロトタイプに追加のコンポーネントを追加するには、次のいずれかの方法を使用します。
Entity Components
リスト内の**+**ボタン;- 正規のUnityのAdd Componentボタンを使用して、適切な
QPrototype
コンポーネントを検索する。
コレクションに関する注意
コンポーネント内の動的コレクションは、プロトタイプに少なくとも1つのアイテムがある場合にのみ自動的に割り当てられます。そうでない場合は、コレクションを手動で割り当てる必要があります。この件に関する詳細は、DSLページの動的コレクションのエントリを参照してください。
階層
ECSでは、エンティティやGameObjectの階層という概念は存在しません。そのため、エンティティプロトタイプは階層やネスティングをサポートしていません。
子プロトタイプは直接サポートされていませんが、以下の方法で対応できます。
- シーン内に別々のプロトタイプを作成し、ベイクする;
- コンポーネント内に参照を保持してリンクする;
- "子"の位置を手動で更新する。
注意: シーン内でベイクされていないプロトタイプは、エンティティがコードで作成されてリンクされる異なるワークフローに従う必要があります。
ゲームオブジェクト(ビュー)内に階層を持つことは可能ですが、エンティティ(シミュレーション)内の階層は自分で処理する必要があります。
プロトタイプの作成/インスタンス化
エンティティプロトタイプがUnityで定義されると、シミュレーションに含める方法はいくつかあります。
シーン/マップにベイクする
エンティティプロトタイプがUnityシーンの一部として作成されると、対応するマップアセットにベイクされます。ベイクされたエンティティプロトタイプは、マップが初期化される際に、そのベイクされた値と共にロードされます。
注意: シーンのエンティティプロトタイプが編集されたり、その値が変更された場合、マップデータを再ベイクする必要があります(プロジェクトの設定によっては、プロジェクトを保存するなどのいくつかのエディタの操作中に自動的に行われる場合があります)。
コード内で
QuantumEntityPrototype
から新しいエンティティを作成するには、以下の手順に従ってください。
QuantumEntityPrototype
コンポーネントを持つGameObjectのUnityプレハブを作成します;- プレハブを、デフォルトで
Assets
フォルダーを含むAsset Search Paths
内のQuantumEditorSettings
アセットに含まれる任意のフォルダーに配置します;
![Entity Prototype Asset](/docs/img/quantum/v3/manual/entityprototype-asset.png)
これにより、プレハブ自体に関連付けられたEntityPrototype
アセットが自動的に生成されます(上記のスクリーンショットに示されている通り)。
- エディター内では、
AssetRef<EntityPrototype>
型のフィールドを通じてそのようなEntityPrototype
アセットを参照することができます。これは、シミュレーションコードを介して作成されるエンティティのプロトタイプを参照する方法であり、Unityで通常の方法(ドラッグアンドドロップやアセットリストからの選択)で行うのと同様に参照できます。
例を挙げると、下のスクリーンショットには、RuntimePlayer
クラスですでに宣言されたフィールドを介して参照する例があります。
![Entity Prototype Asset GUID & Path](/docs/img/quantum/v3/manual/assetref-entityprototype.png)
frame.Create()
を使用してプロトタイプからエンティティを作成します。これは、上記のアセットへの参照を渡すことで最も一般的に行われますが、他にもオーバーロードがあります。
C#
void CreateExampleEntity(Frame f) {
// Using a reference to the entity prototype asset
var exampleEntity = f.Create(myPrototypeReference);
}
注意
シーン内に存在するエンティティプロトタイプはマップアセットにベイクされますが、プレハブ化されたエンティティプロトタイプは、Quantumアセットデータベースの一部である個別のアセットです。
Quantumエンティティビュー
QuantumEntityView
は、エンティティの視覚的表現に対応します。
データ駆動設計の精神に基づき、QuantumエンティティプロトタイプはそのView
コンポーネントを組み込むことも、別のEntityView
アセットを指し示すこともできます。
Self
To set an entity prototype's view to itself, simply add the QuantumEntityView
component to it.
![Entity Prototype with Entity View](/docs/img/quantum/v3/manual/entityprototype-viewself.png)
![Entity Prototype Asset and](/docs/img/quantum/v3/manual/entityprototype-viewselfasset.png)
プロトタイプから分離
エンティティプロトタイプアセットから分離されたビューを設定してリンクするには、次の手順を実行します。
- ビューを表すべきGameObjectに
QuantumEntityView
を追加します; - そのGameObjectのプレハブを作成します;
- これにより、プレハブ内にネストされたEntity View アセットが作成されます。
![Entity Prototype with Entity View](/docs/img/quantum/v3/manual/entityprototype-viewseparate.png)
QuantumEntityView
が関連付けられていないエンティティプロトタイプからViewフィールドをリンクします。新しく作成したEntity View Assetを参照します。これは、ドラッグアンドドロップやUnityのコンテキスト検索メニューを使用して行うことができます。
![Linking an Entity Prototype with a separate Entity View Asset](/docs/img/quantum/v3/manual/entityprototype-viewseparateasset.png)
重要
エンティティビューがUnityで表示されるためには、シーンにQuantumEntityViewUpdater
スクリプトが必要です。