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数量与添加的组件数量之间也通常没有一对一的关系。
Unity ECS 05 创建Gameplay_第1张图片
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创作组件。

你可能感兴趣的:(Unity3D,ECS)