这种编程思想很早前就已经提出,ECS分别是Entity,Component,System的缩写. html
- Entity是实例,做为承载组件的载体,也是框架中维护对象的实体. react
- Component只包含数据,具有这个组件便具备这个功能. git
- System做为逻辑维护,维护对应的组件执行相关操做. github
ECS和传统的OOP相比更看重的是组件,附加组件即具有功能. 编程
C#是面向对象语言,从语言层面上就支持面向对象的编程思想:集成封装和多态. 服务器
按照ECS的思路,功能拆分红组件,而后把这些细小的组件组合便组成了具有所需功能的对象.实际上Unity也是这种实现思路,可是它的组件式属性和逻辑的合集. 框架
最近看了ECS编程思想,看了Entitas逻辑,写了小Demo,感受: 编程思路/框架没有最好只有更合适,可能A框架适合RPG游戏,B框架更适合FPS游戏. oop
【福利】阿里云1888元优惠券红包免费领取:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=t9686fzw
性能
开发中常常会遇到控制时序的逻辑,好比某个Entity必须在另外一个Entity逻辑完成后再执行,固然能够经过添加组件标识来控制时序执行,可是若是存在大量这种逻辑势必会增长不少对应的组件做为标识.阿里云
一样能够添加Component做为控制标识做为过滤条件,A系统要在B系统结束以后,C系统启动以前,D系统挂起时…开发到后期怎么办.(待机,前摇,蓄能,施法,表现,结束,)太多太多状态一帧/分帧维护起来估计也会乱吧.
好比FPS游戏,MOBA游戏用ECS思想拆分合适,每一个玩家的角色功能对等(都是人物,都在移动,战斗)不一样的角色的技能拆分单独实现.
若是是大型RPG游戏,每一个门派角色,大厅npc,商城商人,敌人角色的状态动做各不相同,这种ECS固然能实现,每一个功能,拆分红细小组件,建立对应System类维护,可是这样归根到底一个System通过遍历筛选其实只维护了一个Entity上面的组件.由于角色功能独有,之后这个组件也不会被其余Entity组合使用.
不方便重构
数据分散到对应的组件,好比服务器下发一份最新数据,须要一一维护对应组件的属性,数据收集也是如此.
客户端拆分表现组件后,只包含纯逻辑功能.
在不一样的组件和系统中维护,没必要像oop再拆分表现逻辑.
若是设计合理,能够经过现有组件组合新的Entity.
1- 性能
数据在内存中线性存在,Entity复用.
基于ECS的框架有不少,Entitas即是其中一个.
官方的ECS也会在2018.1beta版本中推出.
根据wiki很容易就可以搭建起项目,运行起工程,可是有些也须要开发者注意,好比Component做为标识仍是做为数据存储;Component生成代码后改变类型或者删除字段后的生成报错,Group/Feature/Unit使用等等.
关于代码生成,它提供两个版本:
- 免费版
- 收费版
免费版根据反射生成代码,须要无编译错误下运行;收费版不须要,即便有代码报错也能够生成代码.。
本身扩展的代码能够分为两部分:
- Components
- 其余代码(System,Service…等其余逻辑)
这样作的好处是从新生成代码时,方便的把这两个目录移除项目(或者StreamingAssets),生成基础代码,而后移回Component代码,而后生成组件代码,而后移回其余代码。
最简单的输出hello world
建立一个Component:
生成代码后建立两个system,一个用来建立entity并附加组件,另外一个用来输出日志:
上面的代码已经实现了输出功能,可是为了方便管理上面的这两个System,咱们添加一个RootSystems专门管理游戏中的各类System:
全部的功能都实现了,在unity工程中添加一个入口方法挂载到场景中,Main.cs:
运行,正常输出,由于输出实现的是reactivesystem,当值发生变化时便会输出.
今天untiy在beta版本中公布了本身的ECS系统,Entity,ComponentData,ComponentSystem,随着unity官方的引入,势必会被推广起来。
【福利】阿里云1888元优惠券红包免费领取:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=t9686fzw