使用塊元件将資料與特定塊相關聯。
塊元件包含适用于特定塊中所有實體的資料。例如,如果您有表示按鄰近度組織的 3D 對象的實體塊,您可以使用塊元件為它們存儲一個集合邊界框。塊元件使用接口類型IComponentData。
盡管塊元件可以具有對單個塊唯一的值,但它們仍然是塊中實體原型的一部分。是以,如果您從實體中删除塊元件,ECS 會将該實體移動到不同的塊(可能是新塊)。同樣,如果您向實體添加塊元件,ECS 會将該實體移動到不同的塊,因為它的原型發生了變化;添加塊元件不會影響原始塊中的剩餘實體。
如果您使用塊中的實體來更改塊元件的值,則會更改該塊中所有實體共有的塊元件的值。如果您更改實體的原型,使其移動到具有相同類型塊元件的新塊中,則目标塊中的現有值不受影響。
如果實體被移動到新建立的塊,則 ECS 會為該塊建立一個新的塊元件并為其配置設定預設值。
使用塊元件和通用元件的主要差別在于您使用不同的函數來添加、設定和删除它們。
相關API
目的
功能
宣言
元件資料
原型塊方法
讀
GetChunkComponentData<T>(ArchetypeChunkComponentType<T>)
檢視
HasChunkComponent<T>(ArchetypeChunkComponentType<T>)
寫
SetChunkComponentData<T>(ArchetypeChunkComponentType<T>, T)
實體管理器方法
建立
AddChunkComponentData<T>(實體)
AddChunkComponentData<T>(EntityQuery, T)
添加元件(實體,元件類型)
擷取類型資訊
擷取元件類型句柄
GetChunkComponentData<T>(ArchetypeChunk)
GetChunkComponentData<T>(實體)
HasChunkComponent<T>(實體)
删除
RemoveChunkComponent<T>(實體)
RemoveChunkComponentData<T>(EntityQuery)
EntityManager.SetChunkComponentData<T>(ArchetypeChunk, T)
塊元件使用接口類型IComponentData。
要直接添加塊元件,請使用目标塊中的實體,或使用選擇一組目标塊的實體查詢。您不能在作業中添加塊元件,也不能使用EntityCommandBuffer添加它們。
您還可以将區塊元件作為ECS 用于建立實體的EntityArchetype或 [ComponentType] 對象清單的一部分。ECS 為每個塊建立塊元件并存儲具有該原型的實體。
将ComponentType.ChunkComponent<T>或 [ComponentType.ChunkComponentReadOnly<T>] 與這些方法一起使用。否則,ECS 會将元件視為通用元件而不是塊元件。
塊中有一個實體
給定目标塊中的實體,您可以使用EntityManager.AddChunkComponentData<T>()函數将塊元件添加到塊中:
使用此方法時,您無法立即為塊元件設定值。
使用EntityQuery
給定一個實體查詢,該查詢選擇了要向其添加塊元件的所有塊,您可以使用EntityManager.AddChunkComponentData<T>()函數來添加和設定元件:
使用此方法時,您可以為所有新塊元件設定相同的初始值。
使用EntityArchetype
當您使用原型或元件類型清單建立實體時,請在原型中包含塊元件類型:
或元件類型清單:
當您使用這些方法時,ECS 作為實體建構的一部分建立的新塊的塊元件将接收預設結構值。ECS 不會更改現有塊中的塊元件。請參閱更新塊元件以了解如何在給定對實體的引用的情況下設定塊元件值。
要讀取塊元件,您可以使用表示塊的ArchetypeChunk對象,或使用目标塊中的實體。
使用 ArchetypeChunk 執行個體
給定一個塊,您可以使用EntityManager.GetChunkComponentData<T>函數讀取其塊元件。以下代碼周遊與查詢比對的所有塊并通路類型為 的塊元件<code>ChunkComponentA</code>:
給定一個實體,您可以使用EntityManager.GetChunkComponentData<T>通路包含該實體的塊中的塊元件:
你可以更新一個塊元件給它所屬塊的引用。在<code>IJobChunk</code>作業中,您可以調用ArchetypeChunk.SetChunkComponentData。在主線程上,您可以使用 EntityManager 版本:EntityManager.SetChunkComponentData。
您不能使用 SystemBase Entities.ForEach 通路塊元件,因為您無權通路<code>ArchetypeChunk</code>對象或 EntityManager。
要更新作業中的塊元件,請參閱在系統中讀取和寫入。
要更新主線程上的塊元件,請使用 EntityManager:
使用實體執行個體
如果塊中有實體而不是塊引用本身,則還可以使用 EntityManger 擷取包含實體的塊:
如果隻想讀取塊元件而不寫入,則應在定義實體查詢時使用ComponentType.ChunkComponentReadOnly以避免建立不必要的作業排程限制。
使用EntityManager.RemoveChunkComponent函數删除塊元件。您可以删除目标塊中給定實體的塊元件,也可以從實體查詢選擇的所有塊中删除給定類型的所有塊元件。
如果您從單個實體中移除塊元件,該實體将移動到不同的塊,因為實體的原型發生了變化。隻要塊中還有其他實體,塊就會保持不變的塊元件。
要在實體查詢中使用塊元件,您必須使用ComponentType.ChunkComponent<T>或 [ComponentType.ChunkComponentReadOnly<T>] 函數來指定類型。否則,ECS 會将元件視為通用元件而不是 Chunk 元件。
在EntityQueryDesc 中
您可以使用以下查詢描述建立一個實體查詢,該查詢選擇所有塊以及這些塊中具有類型為ChunkComponentA的塊元件的實體:
要疊代要為其設定塊元件的所有塊,您可以建立一個實體查詢來選擇正确的塊,然後使用 EntityQuery 對象擷取 ArchetypeChunk 執行個體的清單作為本機數組。ArchetypeChunk 對象允許您向塊元件寫入新值。
請注意,如果您需要讀取塊中的元件以确定塊元件的正确值,則應使用IJobEntityBatch。例如,以下代碼計算包含具有 LocalToWorld 元件的實體的所有塊的軸對齊邊界框:
<code> </code>