エンティティプロトタイプ
イントロダクション
データ駆動設計を円滑にするため、Quantum 2.0で エンティティプロトタイプ を導入しました。
エンティティプロトタイプ とは、以下を含むエンティティのシリアライズされたバージョンです。
- 構成(どのコンポーネントでできているか)
- データ(コンポーネントのプロパティとその初期値)
データと挙動がきれいに区別され、デザイナーは、プログラマーに常に挙動を編集してもらわなくても、データの微調整を行えるようになります。
プロトタイプを設定する
エンティティプロトタイプは、Unityエディターでセットアップできます。
基本
エンティティプロトタイプ を作成するには、エンティティプロトタイプ スクリプトをいずれかのGameObjectに追加します。
エンティティプロトタイプ スクリプトを実行すると、2Dと3Dの両方でよく使用するコンポーネント用のパラメータの設定と定義ができるようになります。
- Transform (2D用Transform2DVerticalを含む)
- PhysicsCollider
- PhysicsBody
- NavMeshPathFinder
- NavMeshSteeringAgent
- NavMeshAvoidanceAgent
PhysicsやNavMesh関連のエージェントに対する依存が尊重されます。
詳細は、それぞれ対応するドキュメントを参照してください。
カスタムコンポーネント
以下を使って エンティティプロトタイプ にさらにコンポーネントを追加できます。
- Add Entity Component ドロップダウン、または
- 適切な エンティティコンポーネント を検索し、通常のUnity Add Component ボタン
コレクションに関する注意点
コンポーネント内の動的なコレクションは、少なくとも1つのアイテムがある場合にのみ自動的に割り当てられます。そうでない場合は、手動でコレクションを割り当てる必要があります。この件に関する詳細な情報は、DSLページの動的コレクションのエントリを参照してください。
ヒエラルキー
ECSにはエンティティ/GameObjectヒエラルキーの概念は存在しません。このようなエンティティプロトタイプはヒエラルキーまたはネスティングをサポートしないためです。
子プロパティは直接サポートされていませんが、以下をおこなうことができます:
- シーンに個別のプロトタイプを作成し、ベイクします。
- コンポーネントの参照を保持しながら、それらをリンクします。
- 「子」の位置を手動でアップデートします。
注: シーンでベイクされていないプロトタイプは、エンティティがコードで作成およびリンクされる、別のワークフローに従う必要があります。
オブジェクトにヒエラルキー(ビュー)を設定できますが、エンティティのヒエラルキー―(シミュレーション)は自分で処理する必要があります。
プロトタイプを作成する・インスタンス化する
Unityで エンティティプロトタイプ を定義すると、シミュレーションに何通りもの方法で組み込むことができるようになります。
Scene/Mapでベイクする
エンティティプロトタイプ がUnity Sceneの一部として作成される場合、対応するMapアセット内にベイクされます。ベイクされた エンティティプロトタイプ は、Mapがベイクされた値で初期化された際に読み込まれます。
注意: シーンの エンティティプロトタイプ が編集されたり、値が変更された場合は、Map Dataを再度ベイクする必要があります。
コード内
エンティティプロトタイプ から、新しいエンティティを作成するには、以下のステップに従います。:
- EntityPrototype スクリプトをもつGameObjectのUnity Prefabを作成する
- プレハブを
Resources\DB
内に置く。
Quantumデータベースをリフレッシュします。
Quantum -> Generate Asset Resources
。エンティティプロトタイプ アセット パスまたはGUIDをシミュレーションで使用できるようにする。
Entity Prototype Asset Window.
- フレームを介して
Create()
を呼び出し、例えば EntityPrototype の参照、またはそのインスタンスを渡します。
C#
void CreateExampleEntity(Frame f){
// using a reference
var exampleEntity = f.Create(myPrototypeReference);
// OR, getting an instance before, using the asset's path as a parameter, and then creating the entity
var entityPrototype = f.FindAsset<EntityPrototype>("Resources/DB/Prefabs/Example|EntityPrototype");
var exampleEntity = f.Create(entityPrototype);
}
備考
シーンに存在する エンティティプロトタイプ は Mapアセット 内にベイクされます。プレハブ化した エンティティプロトタイプ は個別の アセット で、Quantum Asset DataBaseの一部です。
Entity View
Entity View はUnityにおけるエンティティの視覚表現に対応しています。
データ駆動設計では、エンティティプロトタイプ は View コンポーネントを組み込んだり、個別の EntityView アセットを指し示したりします。
重要
UnityでEntity View を表示するには、シーンにEntityViewUpdater
スクリプトが存在する必要があります。
Self
Entity Prototype のビューをそれ自身に設定するには、 Entity View コンポーネントを追加します。
コンポーネントを追加したら、 *Entity Prototype* スクリプトが **Self** を *View* パラメータの値としてリストします。これにより、ネスト化された *Entity View* **アセット** が同じプレハブ内に作成されます。Prototypeから区別する
Entity Prototype アセットから区別したビューを設定・リンクするには、以下の通りに行います。:
- ビューを表現したいGameObjectに Entity View を追加する。
- Entity View を持つGameObjectをプレハブ化する。
- Place the prefab in
Resources\DB
内に上記のプレハブを置くと、プレハブ内でネスト化された Entity View アセット が作成されます。
Quantum -> Generate Asset Resources
データベースをリフレッシュする。- エンティティプロトタイプ から View フィールドを新しく作成した Entity View Asset を使用してリンクする。ドラッグアンドドロップまたはUnityのコンテキスト検索メニューで行う。
重要
UnityでEntity Viewを表示させるには、シーンにEntityViewUpdater
スクリプトが必要です。