ECS开发(一、)ECS是什么?

什么是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());
    }
}

在类前面加上这个特性,系统就不会自动创建了

猜你喜欢

转载自blog.csdn.net/Liu_ChangC/article/details/125066689