开篇
大家好我是IT man今天要来和大家分享的是ECS。我要说的ECS并不是云服务器,而是一种编程思想。是我们在写游戏,写后端可以使用的一种编程思想就像"面向对象编程"、"面向切面编程" 当然也可以认为是一种框架。虽然我个人认为ECS还是一种思想。说了这么多下面就开始聊一聊我们今天的主角-ECS。
ECS的全程是 Entity(实体)-Compoent(组件)-System(系统)
ECS就是由这3个东西组成。那么它们分别都是什么东西呢?那就先来个名词解释:
Entity(实体)
实体它在ECS中扮演的是组件的“载体”,实体是不包含任何数据和业务逻辑的。它的数据结构很简单只有一个ID。所有加在该实体上的组件就会与这个ID关联,通过实体就可以访问到身上的组件和组件上面的数据。
Component(组件)
组件只包含数据,组件本身没有办法改变数据。组件上的数据描述了实体的某一个特征。想要组件产生作用就必须把组件加载到实体上,单独的组件是没有任何意义的。
System(系统)
真正包含业务逻辑的就是系统。系统所关心的东西就是包含一个或者多个组件的集合,系统通过该集合捕获有该集合中所有组件的实体。之后就可以操作这些实体,可以删除,在实体上增加或者删除组件,改变组件上的数据等待。这就是系统做的事情。
world(世界)
这里还要介绍一个概念:world(世界) 世界中就包含了许许多多的系统,世界就是管理这些系统的。可以在世界中停止某一个或者多个系统,让其停止工作。
说了怎么多我最后用流程图的方式简单展示了一下它们指之间的关系:
说了很多理论我相信没有了解过ECS的同学还是一头雾水。这是正常的,IT man 在刚刚接触ECS的时候了解了实体 组件 系统 都是什么后 对于怎么运用ECS到项目里,或是是一个写一个demo来体验一下也是无处下手。网上也很多帖子介绍完ECS是什么时候就结束了。真的是有种“我裤子都脱了就让我看这个”的感觉。
所以作为励志分享干货的IT man 来说我肯定不会说 “今天的文章就带到这里”的话下面我先举一个"栗子"帮助各位同学对ECS的理解加深一下,之后我们在从零开始实现一个简单ECS思想的框架,之后小伙伴可以实现属于自己的ECS框架并在demo或者项目中使用这个框架来代替古老的“面向对象”或者MVC架构。好废话不多说 ,先举一个例子来看看ECS是怎么用的。
场景
在一个世界中 有一个人叫IT man,他在一个岛上生活,晚上了想在营地上生火 附近有 许多木头 自己身上打火石 现在需要生火。
在这个场景中 IT man就是ECS中的实体。一些木头和打火石就是组件 。在这个世界中已经定义好了生火系统。这个生火系统需要 木头组件 + 打火石组件才能运作 ,于是让IT man找到它们。
这是时候IT man就找齐了木头,也准备好了打火石 这个时候生火系统开始工作,告诉 IT man 怎么生火 于是 IT man使用木头和打火石 把火生了起来。
正式开始构建ECS框架
首先定义了一个ECS对象 里面有 一个Component对象来定义组件
systems 对象 来定义系统。
接着 定义了一个ECS.Entity 类 包含了id 和 component 成员变量 。id 自增的用来标识Entity 。component来保存该实体上有哪些组件。之后给Entity 定义了2个方法 一个是 addComponent 和 removeComponent用来给实体增加组件和删除组件。
组件就是一个一个类。
这里我定义了一个组件Fuel 来保存燃料。接着定义组件Flintstone表示是一个打火石
定义一个生火系统 检查是否有实体包含 燃料和打火石组件的。有的话就执行打印一个生火成功
最后我们初始化一个实体 给实体加上 Fuel 和Flintstone 2个组件
最后实现循环检查每一个系统,看看每一个系统是否满足的执行条件。
到这里一个简单的ECS的框架就实现了,并且我们使用了ECS实现了之前的例子。不知道小伙伴学会了么?有什么问题可以在下面留言评论。