杂谈ECS系统

想到什么写什么,就当是练打字了...

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系统是真的强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值