前序
在介绍主角ZECS之前,很有必要介绍一下ECS框架的由来。所谓的ECS模式全称就是Entity-Component-System模式。很早就听说过Unity等引擎中广泛地使用了这样的模式,但从Unity的脚本命名,Unity是就是一种ECS框架。
ECS的出身
由于之前一直从事PC、移动端开发,倒是熟悉MVC、RPC、SOA、SSH等各种前后端框架,对这种ECS设计模式的何时诞生以及其的发展过程不是很了解,说实话也是接触Unity 2年之后才无意中认识了它。
大概查阅它诞生在2002年的Game Dungeon Siege上,ECS全写即“实例-组件-系统”的设计模式。简言之,实例就是一个游戏对象实体,一个实体拥有众多的组件,而游戏系统则负责依据组件对实例做出更新。
举个例子,如果对象A需要实现碰撞和渲染,那么我们就给它加一个碰撞组件和一个渲染组件;如果对象B只需要渲染不需要碰撞,那么我们就给它加一个渲染组件即可。而在游戏循环中,每一个系统都会遍历一次对象,当渲染系统发现对象持有一个渲染组件时,就会根据渲染组件的数据来执行相应的渲染过程。同样的碰撞系统也是如此。
也就是说游戏对象需要什么就会给自己加一个组件。而系统会依据游戏对象增加了哪些组件来做出行为。换言之实例只需要持有必要的数据,由系统负责逻辑就行了。这也就是ECS模式能和数据驱动很好结合的一个原因。
于是在上述问题中所有的派生类都消失了,只留下了GameObject。
特点
从设计原则上讲,它使用组合/聚合关系代替继承关系,游戏对象间避免使用了继承这种强依赖关系,降低了耦合性。同时使用不同的行为/属性组件对实体对象进行修饰,提升了系统的复用性、扩展性。这种模式充分考虑游戏场景的特点