版本:unity 2017.1 语言:C#
总起:
今天才知道2015年谷歌(是Wooga的)在Github上发布了一个名叫Entitas的ECS框架,它主要基于Unity和C#来进行开发。之前还看到暴雪公司在讲他们的《守望先锋》时就用到了类似的技术。
Github地址:https://github.com/sschmid/Entitas-CSharp/wiki。百度上一查也没人来介绍该技术,嘛,我就以一个初学者的眼光来介绍一下该框架的基本原理和用法。
所以什么是ECS框架呢?其实Unity本身的组件开发就是ECS框架。但对比着来说,Unity中写脚本,拖到每一个GameObject下,都是一个MonoBehaviour,一个脚本中既包含了数据又包含了方法;而Entitas的目标是让数据和方法分离,在GameObject下只添加数据,而方法由其他系统完成。
类似于Java、C#中的垃圾回收机制,如果有对象失去了所有引用,则在一个特定的时间点上,垃圾回收机制将所有的对象统一删除。类似的,Entitas下,GameObject的组件不能有任何方法,只保存数据,数据代表特性,拥有一样特性的执行逻辑(也就是方法)会在特定时间点上统一执行。
最终做到数据和方法之间的解耦。有几个非常明显的好处:
1.添加的功能可以逐个做单元测试;
2.代码共享方便;
3.在GameObject下只有数据,没有任何方法或者说没有逻辑上的代码;
4.很容易查询到拥有相同类型数据的对象;
5.效率高,因为普通的MonoBehaviour包含方法,例如在创建100个游戏对象时同样会创建100个相同的方法,然而这显然是没有必要的,因为ECS系统可以用一个方法就代替这100个方法的操作。(创建100个相同方法这边被网友指出是不存在的,不管有多少个对象,方法只有一个,这边大家不要被我误导了。我这边想表达的是:Unity在调用Update时需要反射,所以调用100次会比较费。如果有不对、不准确的地方,还希望不吝指教)
下面来介绍一下框架具体实现的几个部分。
4种概念:
框架的实现上有四种概念,分别是:Entiy实体、Context环境、Group组、Collector收集器,在开始写程序之前必须摸清楚这些概念的职责。
我们先来看一张官方提供的图,对几个概念有个感性的认识: