Unity DOTS Component概述
最近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 的文档,可以关注我们,获取相关的学习资料与代码。