想想看,游戏中有各种各样的对象,比如地板,比如桌子,比如背包。
他们都具备的共同的属性是什么?
位置属性,旋转属性等等。
将这些通用的属性抽象出来,整理为一个父类,是面向对象编程的一个重要的概念:以继承复用通用的代码。
我们将这个父类称之为“节点”
一个具有游戏对象通用属性的实体(cc.Node)
然后让子类继承父类,扩展自己独特的功能。
我们将这个子类称之为“组件”
一个能够扩展游戏对象功能的零部件(cc.Component)
但是注意了。
传统地通过继承扩展功能的方式,会让继承树越长越高,功能的扩展只能基于一个父类,试图基于两个以上的父类进行扩展将不可能实现!(只能进行树结构扩展,而不能进行图结构扩展)
在传统的C++/JAVA中,试图基于两个毫不相关的类进行功能地扩展,我们会使用接口,定义好两个类通信的口头协议(接口),然后实现这个协议(接口)。这样,一个图结构的扩展就能够实现。所有扩展“子类”的关系都能够平铺在地板上成为图,而不是越长越高成为树。
这会引入另一个问题,图的连线达到一定规模后将会变得难以维护,在状态机中有一种缓解这个问题的方案,用分层的状态机: 即对这些连线进行分组。 组内随便连,但是如果要跨组相连,只能由组内的代表代理连线。
这就讲到我们的ECS模型,组内的代表就是E,就是entity,就是我们刚提到的"父类",就是我们刚提到的节点cc.Node
组内的成员就是各式各样的C,就是component, 就是我们刚提到的子类,就是我们刚提到的组件cc.Component
如果当前节点的组件试图访问另一个节点的组件,首先得先得到目标的节点,再访问目标的组件。
组件围着节点转。节点和节点平起平坐。这就是节点和组件的基本关系。
网友评论