Entity Prototypes
概述
為了實現數據驅動設計,Quantum 提供了實體原型功能。
Quantum 實體原型是一個序列化的實體版本,包含以下內容:
- 組成(即由哪些組件構成);以及,
- 數據(即組件的屬性及其初始值)。
這使得數據和行為可以清晰分離,同時讓設計師能夠調整數據,而無需程序員不斷修改行為。
設置原型
實體原型可以在 Unity 編輯器中設置。
基本設置
要創建實體原型,請在任何 GameObject 上添加QuantumEntityPrototype組件。
 
    QuantumEntityPrototype腳本允許設置和定義 2D 和 3D 中最常用的組件參數:
- Transform(包括 2D 的 Transform2DVertical);
- PhysicsCollider;
- PhysicsBody;
- NavMeshPathFinder;
- NavMeshSteeringAgent;
- NavMeshAvoidanceAgent.
物理和 NavMesh 相關代理的依賴關係會被尊重。
更多信息,請閱讀它們各自的文檔。
自定義組件
可以通過以下方式為實體原型添加額外組件:
- 在Entity Components列表中點擊 + 按鈕;
- 使用 Unity 的 Add Component 按鈕,搜索對應的QPrototype組件。
關於集合的注意事項
組件中的動態集合 僅在 原型中至少有一個項目時才會自動分配。否則,必須手動分配集合。更多信息,請參考 DSL 頁面中的動態集合條目。
層級結構
在 ECS 中,不存在實體/GameObject 層級結構的概念。因此,實體原型不支持層級結構或嵌套。
雖然子原型不直接支持,但您可以:
- 在場景中創建獨立的原型並烘焙它們;
- 通過在組件中保留引用來鏈接它們;
- 手動更新「子」實體的位置。
注意: 未在場景中烘焙的原型需要遵循不同的工作流程,即通過代碼創建和鏈接實體。
可以在遊戲對象(視圖)中實現層級結構,但在實體(模擬)中的層級結構需要自行處理。
創建/實例化原型
在 Unity 中定義實體原型後,有多種方式可以將其加入模擬中。
烘焙到場景/地圖中
如果實體原型是作為 Unity 場景的一部分創建的,它將被烘焙到對應的地圖資源中。烘焙後的實體原型將在地圖初始化時加載,並使用烘焙時的值。
注意: 如果場景中的實體原型被編輯或值被更改,必須重新烘焙地圖數據(根據項目設置,某些編輯器操作如保存項目可能會自動完成此操作)。
通過代碼
要從QuantumEntityPrototype創建新實體,請按照以下步驟操作:
- 為帶有QuantumEntityPrototype組件的 GameObject 創建 Unity 預製體;
- 將預製體放置在QuantumEditorSettings資源的Asset Search Paths中包含的任何文件夾中(默認包含整個Assets文件夾):
 
    這將自動生成一個與預製體關聯的EntityPrototype資源,如上圖所示。
- 在編輯器中,可以通過類型為AssetRef<EntityPrototype>的字段引用此類EntityPrototype資源。這是通過模擬代碼創建實體時引用原型的一種方式,同時引用方式類似於 Unity 中常用的拖放或從資源列表中選擇。
 舉例來說,下圖展示了通過RuntimePlayer類中已聲明的字段進行引用的示例:
 
    - 使用frame.Create()從原型創建實體。通常通過傳遞對上述資源的引用完成,但也有其他重載方式:
C#
void CreateExampleEntity(Frame frame) {
    // Using a reference to the entity prototype asset
    var exampleEntity = frame.Create(myPrototypeReference);
}
注意
場景中的實體原型會被烘焙到 地圖資源 中,而預製化的實體原型則是 Quantum 資源數據庫中的獨立 資源。
重命名組件/原型
重命名生成的組件時,實體原型的 Unity 腳本也會隨之改變,這可能導致 Unity 預製體失去與原型腳本的連接,因為它們的腳本 GUID 發生了變化。
可以使用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組件。
 
     
    獨立於原型
要設置並鏈接獨立於 Entity Prototype 資源的視圖:
- 在表示視圖的 GameObject 上添加QuantumEntityView;
- 為該 GameObject 創建預製體;
- 這將在預製體中創建一個嵌套的 Entity View 資源。
 
    - 從未關聯QuantumEntityView的 Entity Prototype 中鏈接 View 字段,引用新創建的 Entity View 資源。可以通過拖放或使用 Unity 上下文搜索菜單完成。
 
    重要提示
要讓 Entity View 在 Unity 中可見,場景中必須包含QuantumEntityViewUpdater腳本。