エンティティプロトタイプ
はじめに
データ駆動設計が楽に行えるように、Quantumにはエンティティプロトタイプが用意されています。
Quantumエンティティプロトタイプは、シリアライズされたエンティティで、以下を含みます。
- 構成(つまり、どのようなコンポーネントで構成されているか)
- データ(つまり、各コンポーネントのプロパティとその初期値)
これによって、データと振る舞いを明確に分離でき、プログラマー側で何度も振る舞いを編集することなく、デザイナー側でデータを調整できるようになります。
プロトタイプのセットアップ
エンティティプロトタイプは、Unityエディターからセットアップできます。
基本
プロトタイプを作成するには、任意のゲームオブジェクトにQuantumEntityPrototype
コンポーネントを追加します。

QuantumEntityPrototype
スクリプトでは、2D/3Dで一般的に使用されるコンポーネントのパラメーターの設定/定義が可能です。
- Transform(2D用のTransform2DVerticalを含む)
- PhysicsCollider
- PhysicsBody
- NavMeshPathFinder
- NavMeshSteeringAgent
- NavMeshAvoidanceAgent
物理やナビメッシュ関連エージェントの依存関係は自動的に考慮されます。
詳細はそれぞれのドキュメントページをご覧ください。
独自コンポーネント
エンティティプロトタイプに独自コンポーネントを追加するには、次のいずれかの方法を使用します。
Entity Components
リスト内の + ボタン- Unity標準の「Add Component」ボタンから、適切な
QPrototype
コンポーネントを検索する
コレクションに関する備考
コンポーネント内の動的コレクションは、プロトタイプに1つ以上存在する場合にのみ自動的な割り当てが行われます。そうでない場合は、コレクションを手動で割り当てる必要があります。詳細は、DSLページの動的コレクションをご覧ください。
階層構造
ECSでは、エンティティ/ゲームオブジェクトの階層構造という概念は存在しません。そのため、エンティティプロトタイプも、階層構造/入れ子構造をサポートしていません。
子プロトタイプは直接サポートされていませんが、以下の方法で実現可能です。
- シーン上で別々にプロトタイプを作成してベイクする
- コンポーネントで参照を保持してリンクする
- 「子」の位置を手動で更新する
備考: シーン上でベイクされていないプロトタイプ(コードから作成/リンクされたエンティティなど)は、異なるワークフローが必要になります。
ゲームオブジェクト(ビュー)側に階層構造を持つことは可能ですが、エンティティ(シミュレーション)側の階層構造は自身で処理する必要があります。
プロトタイプの作成/インスタンス化
Unityでエンティティプロトタイプを定義したら、それを様々な方法でシミュレーションに含めることができます。
シーン/マップでベイクする
エンティティプロトタイプがUnityシーンの一部として作成された場合は、対応するマップアセットにベイクされます。ベイクされたエンティティプロトタイプは、マップが初期化される際に、ベイク時の値でロードされます。
注意: シーン上のエンティティプロトタイプが編集されたり、その値が変更されたりした場合は、マップデータを再ベイクする必要があります(プロジェクトの設定によっては、プロジェクトの保存などのエディター操作時に自動的に行われます)。
コードから
QuantumEntityPrototype
から新しいエンティティを作成するには、以下の手順に従います。
QuantumEntityPrototype
コンポーネントを持つゲームオブジェクトのプレハブを作成するQuantumEditorSettings
のAsset Search Paths
に含まれるフォルダー(デフォルトではAssets
フォルダー以下)にプレハブを配置する

これによって、上記スクリーンショットに示されるように、プレハブに関連付けられたEntityPrototype
アセットが自動的に生成されます。
- エディターでは、
AssetRef<EntityPrototype>
型フィールドからEntityPrototype
アセットを参照できます。これはシミュレーションコードからエンティティプロトタイプを参照する方法で、Unityでの通常の方法と同様に、アセットリストからドラッグ&ドロップで選択して参照できます。
例えば、以下のスクリーンショットでは、RuntimePlayer
クラスで宣言済みのフィールドに参照を持たせています。

frame.Create()
を使用して、プロトタイプからエンティティを作成します。これは、上記アセットの参照を渡すのが最も一般的ですが、他にもオーバーロードが存在します。
C#
void CreateExampleEntity(Frame f) {
// エンティティプロトタイプアセットの参照を使用する
var exampleEntity = f.Create(myPrototypeReference);
}
備考
シーン上に存在するエンティティプロトタイプは、マップアセットにベイクされますが、プレハブ化されたエンティティプロトタイプは、Quantumアセットデータベースの一部である個別アセットになります。
コンポーネント/プロトタイプのリネーム
コンポーネントをリネームすると、生成されたエンティティプロトタイプのUnityスクリプトとそのGUIDも変更されるため、Unityプレハブとの関連付けが切れてしまう可能性があります。
安全にコンポーネントをリネームするには、FormerlyNamed
属性が使用できます。
- リネームする前に
FormerlyNamed
属性を追加する- Quantum SDKが3.0.3より古い場合は
QPrototype..
接頭辞を追加する:FormerlyNamed("QPrototypeOldComponentName")
- Quantum SDKが3.0.3より古い場合は
- CodeGenによってスクリプトのGUIDが自動的に移行される
Qtn
[FormerlyNamed("OldComponentName")]
component NewComponentName {
}
Quantumエンティティビュー
QuantumEntityView
は、エンティティの視覚的表現に相当します。
Quantumエンティティプロトタイプはデータ駆動設計に従って、View
コンポーネントを組み込むことも、別のEntityView
アセットを指し示すこともできます。
プロトタイプ自身
エンティティプロタイプ自身にビューを設定するなら、単純にQuantumEntityView
コンポーネントを追加してください。

コンポーネントが追加されると、エンティティプロトタイプスクリプトはView
パラメーターの値にSelf
を表示します。これによって、同じプレハブ内にエンティティビューアセットが入れ子で作成されます。

プロトタイプから分離
エンティティプロトタイプアセットからビューを分離してリンクするには、次の手順に従います。
- ビュー表現させたいゲームオブジェクトに
QuantumEntityView
を追加する - そのゲームオブジェクトのプレハブを作成する
- これによって、プレハブ内にエンティティビューアセットが入れ子に作成される

QuantumEntityView
が関連付けられていないエンティティプロトタイプのView
フィールドから、新しく作成されたエンティティビューアセットを参照する(ドラッグ&ドロップや、Unityの検索メニューを使用できる)

重要
エンティティビューをUnityで表示するには、シーンにQuantumEntityViewUpdater
スクリプトが必要です。