Unity中的ComponentData(ECS中的component)对象,是个仅存储一个Entity数据的结构体。ComponentData不能包含方法,除了访问数据的函数。所有的游戏逻辑都应该在System中实现。这相当于是老的Unity中的Component,只是只包含变量。
ECS提供了 IComponentData,可以实现该接口。
IComponentData
传统的Unity components(包括MonoBehaviour)是面向对象的,包含了数据和方法。IComponentData是纯粹的ECS类型的组件,只有数据,没有方法。同时它是结构体,因此默认赋值是通过值拷贝,而不是引用。修改它的数据通常要像下面这样:
var transform = group.transform[index]; // 读取数据
transform.heading = playerInput.move; // 修改数据
transform.position += deltaTime * playerInput.move * settings.playerMoveSpeed;
group.transform[index] = transform; // 将数据写回去
ponentData结构体不能持有托管对象的引用,因为所有的ComponentData都是创建在无垃圾回收的chunk memory上(不需要)。