最近DOTS终于发布了正式的版本, 我们来分享以下DOTS里面地几个关键概念,方便大家上手学习掌握Unity DOTS开发。
Unity DOTS 中Entity作为实体不直接去存放数据,而是将数据以一个个的组件为载体来存放起来。每个Entity会得到一些不同的ComponentData的组合,这些组合代表着不同的Entity类型,描述这些组合的对象叫做ArchType。Component包含了Entity中的数据,同时给System来进行读写访问。
当我们定义一个Component,我们需要继承IcomponentData接口类。IcomponentData什么方法都没有定义,只是标记这个结构类型是一个ECS中ComponentData的组件类。当我们使用struct 来定义ComponentData的时候,意味着我们使用的是一个非托管(垃圾回收)的对象,里面的数据成员也是需要用非托管的,如果你要用托管的数据成员与对象,你可以把struct 改成class来定义。
Component的内存基于Chunk(16kib)来分配特定ArchType的大小(不同组件组合后的内存大小)的内存,Component属于这个内存块中的某一个部分。比如A类Entity是由A,B,C组件组成,那么ArchType就是[A, B, C] ArchType就是每个组件的总和。通过Chunk,分配一个ArchType的内存出来,这样Entity某个ComponentData就是这个内存块中的一个部分。
Chunk(16Kib): 【[A, B, C, …],[A, B, C, …],[A, B, C, …],[A, B, C, …],[A, B, C, …]】
我们在做DOTS开发中常用的有几种常用的Component类型,总结如下:
Unmanaged Component: 使用最多的非托管的组件类型,但是里面的数据成员必须是非托管的,所以类型有限。
Managed Component: 可以托管的组件类型, 里面的数据成员也可以是任意的类型;
Shared Component: 多个Entity实例公用一个ComponentData的内存。
Cleanup Component: 如果我们的某个Entity有一个CleanupComponent的时候,当我们销毁一个Entity的时候,会清理掉其它所有的组件。
Tag Component: 非托管的组件对象,起到标记的作用,可以使用tag component来筛选Entity。
Buffer Component: 定义了一个可以改变数组大小的数组数据。
Enable Component: 可以enable/disable某个组件,而不是像Remove组件一样改变entity的ArchType, 因为改变ArchType非常消耗性能。
更多的Unity DOTS 的文档,可以关注我们,获取相关的学习资料与代码。