Unity ECS 05 創建Gameplay

這個部分包含了如何在Unity編輯器中創建基於DOTS的遊戲和其他一些信息。它還涵蓋了ECS提供的幫助你實現遊戲功能的系統和組件。
該系統包括:

  • Unity.Transforms:提供描述物體變換的組件,描述對象的父子層次結構的組件,以及管理它們的系統。
  • Unity.Hybrid.Renderer:提供了爲了在Unity中渲染ECS實體所需的組件和系統。

譯註:創作這個詞應該是指用Unity的Gameobject和原生的組件進行遊戲製作。或者原生的工作流與ECS工作流結合起來進行遊戲製作。

創作概覽

您可以使用Unity編輯器(帶有必需的DOTS包)來創建基於DOTS的遊戲。 在編輯器中,您可以正常使用GameObjects來編寫場景,而ECS可以將GameObjects轉換爲實體。
使用DOTS的最大區別在於,您不是定義自己的MonoBehaviours來存儲實例數據和實現自定義遊戲邏輯,而是可以定義ECS組來存儲數據,併爲自定義邏輯編寫系統。

GameObject 轉換

在GameObject轉換期間,各種轉換系統會處理相應的MonoBehaviour組件,然後將其轉換爲基於ECS的組件。 例如,一個Unity.Transforms轉換系統將檢查UnityEngine.Transform組件並添加ECS組件(例如LocalToWorld)來代替它。
您可以用實現了IConvertGameObjectToEntity 的MonoBehaviour組件來控制轉換步驟。 ECS轉換的GameObjects數量與被創建的實體數量之間通常沒有一對一的關係。 在GameObject上的MonoBehaviours數量與添加的組件數量之間也通常沒有一對一的關係。

ECS會對具有ConvertToEntityMonoBehaviour類型組件(即,Unity原生組件,不是ECS的組件)的遊戲物體,或者SubScene的一部分的GameObject進行轉換。 無論哪種情況,轉換系統都(例如Unity.Transforms和Unity.Hybrid.Render)都將處理GameObject或Scene Asset的任何子GameObject。
使用ConvertToEntity轉換GameObjects和使用SubScene進行轉換之間的區別是ECS序列化並將其從SubScene轉換生成的實體數據保存到磁盤。 您可以在運行時非常快速地加載或用流來處理此序列化數據( You can load or stream this serialized data very quickly at run time. )。 相比之下,ECS則是在運行時將具有ConvertToEntity MonoBehaviours的GameObjects轉換。
最佳實踐是使用標準MonoBehaviours進行創作,並使用IConvertGameObjectToEntity將這些組件的值轉換到 IComponentData結構以供運行時使用。 通常,最方便編寫的數據佈局並不是運行時最有效的數據佈局。

Generated authoring components

Unity可以自動爲簡單的運行時ECS組件生成創作組件。 Unity生成創作組件時,您可以將包含ECS組件的添加腳本直接添加到編輯器中的GameObject。 然後,您就可以使用“檢查器”窗口來設置組件的初始值。

[GenerateAuthoringComponent]
public struct RotationSpeed_ForEach : IComponentData
{
    public float RadiansPerSecond;
}

請注意以下限制:

  • 單個C#文件中只有一個組件可以具有生成的創作組件,並且C#文件中不能包含另一個MonoBehaviour。
  • ECS僅反映公共字段,並且與組件中指定的名稱相同。
  • ECS將IComponentData中的Entity類型的字段反映爲它生成的MonoBehaviour中的GameObject類型的字段。 ECS會將您分配給這些字段的GameObjects或Prefabs轉換爲引用的Prefabs。

對於 IBufferElementData

您還可以通過添加[GenerateAuthoringComponent]屬性爲實現IBufferElementData的類型生成創作組件

[GenerateAuthoringComponent]
public struct IntBufferElement: IBufferElementData
{
    public int Value;
}

在此示例中,將生成一個名爲IntBufferElementAuthoring的類(從MonoBehaviour繼承),其包含一個List 類型的公共字段。 在轉換過程中,此列表將轉換爲DynamicBuffer ,然後該類型添加到的實體中。
請注意以下限制:

  • 單個C#文件中只有一個組件可以具有生成的創作組件,並且C#文件中不能包含另一個MonoBehaviour。
  • 對於包含2個或更多字段的類型,無法自動生成IBufferElementData創作組件。
  • 無法爲具有顯式佈局的類型自動生成IBufferElementData創作組件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章