This document is about: QUANTUM 3
SWITCH TO

Entity Prototypes

概述

為了實現數據驅動設計,Quantum 提供了實體原型功能。

Quantum 實體原型是一個序列化的實體版本,包含以下內容:

  • 組成(即由哪些組件構成);以及,
  • 數據(即組件的屬性及其初始值)。

這使得數據和行為可以清晰分離,同時讓設計師能夠調整數據,而無需程序員不斷修改行為。

設置原型

實體原型可以在 Unity 編輯器中設置。

基本設置

要創建實體原型,請在任何 GameObject 上添加QuantumEntityPrototype組件。

Entity Prototype Script on an empty GameObjet
基本實體原型(空 GameObject + 實體原型腳本)。

QuantumEntityPrototype腳本允許設置和定義 2D 和 3D 中最常用的組件參數:

  • Transform(包括 2D 的 Transform2DVertical);
  • PhysicsCollider;
  • PhysicsBody;
  • NavMeshPathFinder;
  • NavMeshSteeringAgent;
  • NavMeshAvoidanceAgent.

物理和 NavMesh 相關代理的依賴關係會被尊重。
更多信息,請閱讀它們各自的文檔。

自定義組件

可以通過以下方式為實體原型添加額外組件:

  • Entity Components列表中點擊 + 按鈕;
  • 使用 Unity 的 Add Component 按鈕,搜索對應的QPrototype組件。

關於集合的注意事項

組件中的動態集合 僅在 原型中至少有一個項目時才會自動分配。否則,必須手動分配集合。更多信息,請參考 DSL 頁面中的動態集合條目

層級結構

在 ECS 中,不存在實體/GameObject 層級結構的概念。因此,實體原型不支持層級結構或嵌套。

雖然子原型不直接支持,但您可以:

  1. 在場景中創建獨立的原型並烘焙它們;
  2. 通過在組件中保留引用來鏈接它們;
  3. 手動更新「子」實體的位置。

注意: 未在場景中烘焙的原型需要遵循不同的工作流程,即通過代碼創建和鏈接實體。

可以在遊戲對象(視圖)中實現層級結構,但在實體(模擬)中的層級結構需要自行處理。

創建/實例化原型

在 Unity 中定義實體原型後,有多種方式可以將其加入模擬中。

烘焙到場景/地圖中

如果實體原型是作為 Unity 場景的一部分創建的,它將被烘焙到對應的地圖資源中。烘焙後的實體原型將在地圖初始化時加載,並使用烘焙時的值。

注意: 如果場景中的實體原型被編輯或值被更改,必須重新烘焙地圖數據(根據項目設置,某些編輯器操作如保存項目可能會自動完成此操作)。

通過代碼

要從QuantumEntityPrototype創建新實體,請按照以下步驟操作:

  1. 為帶有QuantumEntityPrototype組件的 GameObject 創建 Unity 預製體;
  2. 將預製體放置在QuantumEditorSettings資源的Asset 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 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")
  • CodeGen 將自動遷移腳本 GUID

Qtn

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

Quantum 實體視圖

QuantumEntityView對應於實體的可視化表示。
在數據驅動設計的理念下,Quantum 實體原型可以包含其View組件,也可以指向獨立的EntityView資源。

自身視圖

要將實體原型的視圖設置為自身,只需為其添加QuantumEntityView組件。

Entity Prototype with Entity View
帶有「自身」視圖的實體原型。
添加組件後,實體原型腳本將在 *View* 參數中列出 **Self**。這還會在同一預製體中創建一個嵌套的 *Entity View* **資源**。
Entity Prototype Asset and
實體原型資源和「自身」視圖資源。

獨立於原型

要設置並鏈接獨立於 Entity Prototype 資源的視圖:

  1. 在表示視圖的 GameObject 上添加QuantumEntityView
  2. 為該 GameObject 創建預製體;
  3. 這將在預製體中創建一個嵌套的 Entity View 資源
Entity Prototype with Entity View
實體原型資源和獨立的實體視圖資源。
  1. 從未關聯QuantumEntityViewEntity Prototype 中鏈接 View 字段,引用新創建的 Entity View 資源。可以通過拖放或使用 Unity 上下文搜索菜單完成。
Linking an Entity Prototype with a separate Entity View Asset
將實體原型與獨立的實體視圖資源鏈接。

重要提示

要讓 Entity View 在 Unity 中可見,場景中必須包含QuantumEntityViewUpdater腳本。

Back to top