什么是ECS?
ECS是一种软件架构模式,由三个元素组成:实体(Entity),组件(Component)和系统(System)
E: Entity
一个不代表任何意义的实体(可以理解为Unity里的一个空的GameObject)
挂载 ConvertToEntity 组件
C: Component
一个只包含数据的组件(可以理解为Unity的一个自定义组件,里面只有数据,没有任何方法)
继承 IComponentData 接口
S: System
一个用来处理数据的系统(可以理解为Unity的一个自定义组件,里面只有方法,没有任何数据)
继承 ComponentSystem 基类
基础学习
ECS调试面板
EntityDebugger实体控制台
运行程序之后,可以在控制台,看到所有在使用的系统,我们新建的实体在面板上看不到,也在这里
新建一个实体Entity
手动新建一个对象,给它添加一个ConvertToEntity脚本,运行后,会发对象在Hierarchy面板上消失了,我们打开EntityDebugger实体控制台可以看到我们消失的实体和它的组件信息
新建一个数据组件Component
这个组件不能是class,因为class可以为null
而我们的数据组件不能为空,所以我们要使用结构体struct,而且它必须基础IComponentData接口
public struct TestComponentData : IComponentData
{
public float testData ;
}
使用代理类,给实体添加组件
我们虽然新建了一个数据组件,但是因为没有继承Unity的MonoBehaviour所以不能像之前一样,直接把组件添加到实体上,所以我们需要使用代理类,替我们把组件添加给实体
public class Authoring : MonoBehaviour,IConvertGameObjectToEntity {
public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
{
dstManager.AddComponentData(entity, new TestComponentData() { testData= 2 });
}
}
新建一个系统System
我们的系统是不用挂载的,要继承ComponentSystem类
public class PrintComponten : ComponentSystem {
protected override void OnUpdate()
{
Debug.Log("打印信息");
}
}
运行之后,我们的打印系统也在正常的工作
到这里,我们已经对ECS的三个部分有了最基础的了解了
屏蔽系统之间的互相干扰
如果我们新建了一个System,会发现,只要运行程序,所有系统都会一直运行,其实有一个特性,可以让系统不能自动创建
[DisableAutoCreation]
[DisableAutoCreation]
public class TestTransformCorrelation : MonoBehaviour, IConvertGameObjectToEntity
{
public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
{
dstManager.AddComponentData(entity, new RotationEulerXYZ());
}
}
在类前面加上这个特性,系统就不会自动创建了