This document is about: QUANTUM 3
SWITCH TO

エンティティプロトタイプ

はじめに

データ駆動設計が楽に行えるように、Quantumにはエンティティプロトタイプが用意されています。

Quantumエンティティプロトタイプは、シリアライズされたエンティティで、以下を含みます。

  • 構成(つまり、どのようなコンポーネントで構成されているか)
  • データ(つまり、各コンポーネントのプロパティとその初期値)

これによって、データと振る舞いを明確に分離でき、プログラマー側で何度も振る舞いを編集することなく、デザイナー側でデータを調整できるようになります。

プロトタイプのセットアップ

エンティティプロトタイプは、Unityエディターからセットアップできます。

基本

プロトタイプを作成するには、任意のゲームオブジェクトにQuantumEntityPrototypeコンポーネントを追加します。

Entity Prototype Script on an empty GameObjet
基本的なエンティティプロトタイプ(空ゲームオブジェクト + エンティティプロトタイプのスクリプト)

QuantumEntityPrototypeスクリプトでは、2D/3Dで一般的に使用されるコンポーネントのパラメーターの設定/定義が可能です。

  • Transform(2D用のTransform2DVerticalを含む)
  • PhysicsCollider
  • PhysicsBody
  • NavMeshPathFinder
  • NavMeshSteeringAgent
  • NavMeshAvoidanceAgent

物理やナビメッシュ関連エージェントの依存関係は自動的に考慮されます。
詳細はそれぞれのドキュメントページをご覧ください。

独自コンポーネント

エンティティプロトタイプに独自コンポーネントを追加するには、次のいずれかの方法を使用します。

  • Entity Componentsリスト内の + ボタン
  • Unity標準の「Add Component」ボタンから、適切なQPrototypeコンポーネントを検索する

コレクションに関する備考

コンポーネント内の動的コレクションは、プロトタイプに1つ以上存在する場合にのみ自動的な割り当てが行われます。そうでない場合は、コレクションを手動で割り当てる必要があります。詳細は、DSLページの動的コレクションをご覧ください。

階層構造

ECSでは、エンティティ/ゲームオブジェクトの階層構造という概念は存在しません。そのため、エンティティプロトタイプも、階層構造/入れ子構造をサポートしていません。

子プロトタイプは直接サポートされていませんが、以下の方法で実現可能です。

  1. シーン上で別々にプロトタイプを作成してベイクする
  2. コンポーネントで参照を保持してリンクする
  3. 「子」の位置を手動で更新する

備考: シーン上でベイクされていないプロトタイプ(コードから作成/リンクされたエンティティなど)は、異なるワークフローが必要になります。

ゲームオブジェクト(ビュー)側に階層構造を持つことは可能ですが、エンティティ(シミュレーション)側の階層構造は自身で処理する必要があります。

プロトタイプの作成/インスタンス化

Unityでエンティティプロトタイプを定義したら、それを様々な方法でシミュレーションに含めることができます。

シーン/マップでベイクする

エンティティプロトタイプがUnityシーンの一部として作成された場合は、対応するマップアセットにベイクされます。ベイクされたエンティティプロトタイプは、マップが初期化される際に、ベイク時の値でロードされます。

注意: シーン上のエンティティプロトタイプが編集されたり、その値が変更されたりした場合は、マップデータを再ベイクする必要があります(プロジェクトの設定によっては、プロジェクトの保存などのエディター操作時に自動的に行われます)。

コードから

QuantumEntityPrototypeから新しいエンティティを作成するには、以下の手順に従います。

  1. QuantumEntityPrototypeコンポーネントを持つゲームオブジェクトのプレハブを作成する
  2. QuantumEditorSettingsAsset Search Pathsに含まれるフォルダー(デフォルトではAssetsフォルダー以下)にプレハブを配置する
Entity Prototype Asset
エンティティプロトタイプのプレハブ + 生成されたエンティティプロトタイプアセット

これによって、上記スクリーンショットに示されるように、プレハブに関連付けられたEntityPrototypeアセットが自動的に生成されます。

  1. エディターでは、AssetRef<EntityPrototype>型フィールドからEntityPrototypeアセットを参照できます。これはシミュレーションコードからエンティティプロトタイプを参照する方法で、Unityでの通常の方法と同様に、アセットリストからドラッグ&ドロップで選択して参照できます。
    例えば、以下のスクリーンショットでは、RuntimePlayerクラスで宣言済みのフィールドに参照を持たせています。
Entity Prototype Asset GUID & Path
エディターでエンティティプロトタイプアセットを参照する
  1. 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")
  • CodeGenによってスクリプトのGUIDが自動的に移行される

Qtn

[FormerlyNamed("OldComponentName")]
component NewComponentName {
} 

Quantumエンティティビュー

QuantumEntityViewは、エンティティの視覚的表現に相当します。
Quantumエンティティプロトタイプはデータ駆動設計に従って、Viewコンポーネントを組み込むことも、別のEntityViewアセットを指し示すこともできます。

プロトタイプ自身

エンティティプロタイプ自身にビューを設定するなら、単純にQuantumEntityViewコンポーネントを追加してください。

Entity Prototype with Entity View
「自身」のビューを持つエンティティプロトタイプ

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

Entity Prototype Asset and
エンティティプロトタイプアセットと、「自身」のビューアセット

プロトタイプから分離

エンティティプロトタイプアセットからビューを分離してリンクするには、次の手順に従います。

  1. ビュー表現させたいゲームオブジェクトにQuantumEntityViewを追加する
  2. そのゲームオブジェクトのプレハブを作成する
  3. これによって、プレハブ内にエンティティビューアセットが入れ子に作成される
Entity Prototype with Entity View
エンティティプロトタイプアセットと、別個のエンティティビューアセット
  1. QuantumEntityViewが関連付けられていないエンティティプロトタイプのViewフィールドから、新しく作成されたエンティティビューアセットを参照する(ドラッグ&ドロップや、Unityの検索メニューを使用できる)
Linking an Entity Prototype with a separate Entity View Asset
エンティティプロトタイプと別個のエンティティビューアセットとのリンク

重要

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

Back to top