ECS模式
ECS 是Entity-Component-System的缩写,即 实体-组件-系统 ,这种模式常用于游戏开发当中,其中“过气”游戏《守望先锋》使用了这种模式进行开发,令这种模式受到了一点曝光度,对于这种模式,目前国内的资料并不是很多。
ECS模式遵循组合大于继承的原则,游戏场景中每项物件都是一个实体(Entity),每个实体(Entity)又由一个或多个组件(Component)构成:
组件
其中组件(Component)仅代表数据,不包括实现:
例如移动组件(MoveComponent)含有属性移动速度、当前位置、目的位置、移动方向。
当一个实体含有了移动组件,就相当于拥有了移动的能力。
实体
实体就是组件的集合
上面的玩家实体含有三个组件,就具备了这提高力量、移动和续命(-1s)的能力,当玩家遭受了控制技能衰弱,力量组件失效,此时只要将力量组件从玩家实体上移除即可,非常灵活。
系统
功能由系统(System)来实现,而系统(System)不包括状态。
系统能够对拥有一个或多个组件的实体组进行操作,能够通过拥有什么组件寻找出相应的实体,最后对实体进行操作。
这里的续命系统只对含有续命组件的实体进行操作。
与Unity的(GameObejct-Component)相比ECS有什么不同
ECS和Unity的模式有点接近:实体(Entity)与GameObject相似,Unity上一个GameObject上能够有多个Component,但是Unity上的Component包含了逻辑实现,与ECS的Component只表示特性的数据、不作为实现的特性有所不同。
与传统OOP相比,ECS的不同之处
OOP是自上而下的、必须要确定自己是什么:就好比儿子就是儿子,爸爸就是爸爸。儿子继承于爸爸,爸爸继承于爷爷。子类继承于基类,儿子想要获得爷爷的人生经验就必须先得问过爸爸。
ECS是同一层次的、有什么用什么:一个实体只需要将组件挂载起来就能拥有相应的功能。就如儿子直接将爸爸的财富,爷爷的人生经验拿来用,一样可以获得不知道高到哪里去的成就。
ECS还有支持回放的优点,实体每次变更的状态都可以存放起来,比如能够重现死亡镜头,同时由于可以对比上一个时间的状态,就能够对防作弊起到很大的作用。
Unity中的使用
Entitas是针对C#和Unity实现ECS快速架构的解决方案。
Github地址:https://github.com/sschmid/Entitas-CSharp
本来用ECS模式的就比较少了,我找了一下用这个框架写的都是一些小型Demo,例如显示一个图片,移动一幅图片。却没见到什么大型项目是用了这个的(或者人家用了但是不公开),这个模式就是适合做一些比较大型的项目才能突显它的优点。
我现在决定用这个框架写我的毕业设计项目《无畏之争》,也能说是前所未有的挑战。
参考
云风大佬的文章:浅谈《守望先锋》中的 ECS 构架
油管上的视频介绍:Unite Europe 2016 - ECS architecture with Unity by example