通常来讲,咱们实现游戏实体都是采用面向对象的方法进行编程。每个实体都是一个对象,而且须要一个基于类的实例化系统,容许实体经过多态来扩展。可是,这样的方法,每每致使系统中出现大量的类,形成类爆炸的状况出现。随着新的实体出现,咱们发现很难在类继承图中添加新的实体,特别是当这个实体须要不少不一样类型的功能的时候。你能够看下下面的一个简单的类图继承。一个静态的敌人,并不可以很好的继承出来。数据结构
为了解决这样的问题,游戏开发人员想出了经过组合而不是继承的方法来进行实体的构建。一个实体,就是一群组件的聚合,经过这样的方式,它具备如下面向对象方法所不具备的好处:ide
1.容易添加新的复杂的实体类型阿里云
2.容易定义新的实体数据设计
3.更加的高效率3d
下面是如何实现实体的一种方式。注意,这里的组件都是纯粹的数据,没有任何的方法,在下面会详细解释为何这么作。
代理
一个组件可使用C中的结构体来进行设计。它没有方法,只是用来存储一些数据,并不在它之上进行动做。一个经典的实现方式是,每个不一样的组件都继承至一个抽象的Componet类,经过这样的方法咱们可以在运行时动态的添加组件,识别组件。每个组件都描述了实体的某个属性特征。当他们单独存在的时候,其实是没有任何意义的,可是当多个组件经过系统的方式组织在一块儿,就可以发挥强大的力量。咱们可使用空的组件来对实体进行标记,从而可以在运行时动态的识别它。cdn
注意,我在上面没有提到任何和游戏逻辑相关的话题。游戏逻辑是系统须要进行的工做。一个系统就是对全部相关联的组件记性操做,好比说,同一个实体的组件。举个例子,人物的移动系统可能会对位置(Position),速度(Velocity),碰撞(Collider),和输入(Input)进行操做。每个系统,都会在每一帧中按照逻辑上的顺序进行更新。若是要让一个角色跳起来,咱们只要检测下Input中的keyJump按键是否被按下,若是是,那么系统就会查看下载Collider中是否有一个接触了地面,若是是,就将这个实体的Velocity的y速度设置一下,让这个物体跳起来。htm
因为系统只会对相关联的组件进行操做,因此组件就定义了一个实体所应该具备的行为。好比说,若是一个实体有一个Position组件,可是没有Velocity组件,那么咱们就知道,这个物体是静止不动的,系统就不会对这个实体的Position组件进行操做了。当咱们对这个实体增长了一个Velocity组件的时候,系统就会使用Velocity组件来对物体进行移动。这样的行为可使用被标记的组件来进行,被标记的组件可以重复的使用在不一样的上下文中。对一个实体,增长一个空的Player组件,将会为这个实体打上了Player的标签,那么PlayerControl系统,就会寻找带有这个标签的全部组件,而后使用Input中的数据,进行操做。
使用了CES系统以后,咱们就能够避免使用大量的类了。实体就是你游戏中存在的物体,它隐式的使用一系列的组件进行定义,这些组件都是纯粹的数据,只有系统才可以操做他们。
我但愿我已经成功的向您解释了什么是CES系统,而且你有欲望在本身接下来的项目中试试这个系统的效果。若是你有任何关于本片文章的疑问,很感谢你在后面留下你的问题。