想到什么写什么,就当是练打字了...
well,最近写游戏引擎的时候,学到一个特别强的架构,ECS系统,其为DOP编程,不同于OOP编程,ECS系统中一个对象的本质是一个ID...right可以是一个unsigned int,嗯...其整个编程的模式是设计模式中的组合优于继承的极端,其一个对象都是由组件组成的[此对象不是OOP概念中的对象],那么一个对象本身不需要存储数据,只需要一个ID,通过这个ID将系统获取系统中的组件,其可以运行时插入和玻璃一个对象中的组件;
我觉得...也不是我一个人觉得,是绝大部分人觉得,在构建大型系统时,例如游戏引擎,ECS系统是永远强于用面向对象的思路,因为继承实在是...懂的都懂,没用好的话,描述代码的量词就从段变成坨了,但是ECS系统中就不会有这种情况,所有的对象都是一个ID,何来继承一说。
我也写了一个大概能看的ECS系统,代码量的话,也不算多,因为其大部分是模板,说到模板,我写了这个系统后,对模板的熟练度...不能说是升华,那样太狂了,如果这样说的话以我生活20年的经验来看,以后一定会觉得现在的自己蠢飘蠢飘的,只能说是有所提高,一般ECS系统的格式是这样的:
entity ent = ECSSystem.Create();//创建一个实体
ECSSystem.AddComponent<MyComponent>(ent);//为实体增加MyComponent组件
MyComponent* cmp = ECSSystem.GetComponent<MyComponent>(ent);//获取实体的组件
托模板、lambda、void*的福,我们可以将任何class、struct作为组件;
如果让我简单的概括ECS系统的核心思想的话,我会这样说:每一个enttity就是一把钥匙,这个钥匙是唯一的,也对应多个宝箱,我们可以向宝箱中加入任何我们想加入的东西,但是宝箱很特殊,只能存一种名为void*的东西,向里加的东西都会变成void*,但是我们打开保险时可以将东西复原。
...有点恐怖小说的味道了,不难发现,这是用了magic;
然后我今天写CameraSystem的时候,由于是初生牛犊,所以就乱写,将鼠标和键盘事件的处理交给了ECS中的System部分,(⊙﹏⊙),立刻、马上、即刻我的CameraSystem就变成依托答辩了,想想也是,怎么能让CamerSystem的Controller交给System呢,因为大部分游戏引擎都可以自定义Camera的行为的,今天学习项目的时候,学到了另外一种手法,用c++写Script;
这种技巧需要几个class:
1:ScriptableCarrier[我个人偏向将Entity称为Carrier]
2:NativeScriptComponent
其中ScriptableCarrier是所有脚本类的父类,NativeScriptComponent持有一个ScriptableCarrier;
ScriptableCarrier的作用是使脚本可以访问绑定到的Carrier的其他组件,NativScriptComponent的作用则是使ECS的System部分可以调用脚本中的函数;
其使用到的一些c++特性还是模板、lambda;
呼,ECS系统是真的强