(转)我所理解的Entitas——入门(一)
关于ECS框架
ECS框架被大家所熟知是源于2017年GDC大会上《守望先锋》针对他们关于ECS架构的做了一次技术分享,在此之前ECS框架只是并未被广泛使用和流传。和传统的OOP框架以类为基础将数据和逻辑放在类中处理的方式不同,ECS是以功能为基础,遵循组合优于继承的原则将功能分开处理。这样一个游戏物品有着什么功能取决与他有什么组件,其他关于ECS和传统框架的区别或者ECS的优点可以自行百度。这里主要介绍ECS的概念以便之后理解Entitas。
在ECS中每个基本单位都是一个实体,一个实体由N个组件组成。然后拥有相同组件的实体会被特定的系统处理特定的逻辑。E(ntity)——C(omponent)——S(ystem):
Entity 实体,组件的载体本身并无意义,拥有什么功能完全取决于拥有什么组件。但是可以通过在游戏中增加或删除组件来改变实体的型为。
Component 组件,包含了代表其对应特性的数据,所以组件中没有任何方法。
System 系统,用来处理一个或多个具有相同组件的实体,即系统中没有任何数据。
例如一个物体有移动的特性,那么我们可能有SpeedComponent,DirectionComponent,PositionComponent三个组件分别用来表示速度,方向和位置,还有一个MoveSystem用来处理每帧的移动,那么拥有上面三个组件的实体都会具有移动功能,哪怕这个实体是一栋房子或者一座山。
Entitas
关于Entitas
Unity在2018年也发布了自己的ECS框架entities。而Entitas发布时间会比Unity的ECS框架发布的早的多。据说在2015年就已经发布,同时在Github上有着4K+的Star。我是项目需要才粗略研究了一下Entitas并在这里形成文档记录一下自己的学习笔记。
下载安装
官方发布了Github和AssetStore两个版本。AssetStore上的版本售价90$。望而却步选择了丐版(Github版本)。两个版本的区别在于AssetStore版本提供了Jenny插件,可以不依赖于Unity的编辑器生成代码。这样的好处是我们使用Github版本在开发过程中每次生成代码的时候必须没有语法错误。
下载地址:
Github版本 :https://github.com/sschmid/Entitas/releases
AssetStore版本 :https://assetstore.unity.com/?q=entitas&orderBy=1
下载后将压缩包中的Assets文件夹下的DesperateDevs和Entitas两个文件夹拷贝到项目的Assets文件夹中。然后等待Unity编译完成可以在菜单栏Tools下看到Jenny和Entitas两个按钮。
自动生成代码
-
在菜单栏Tools->Jenny->Preferences打开Jenny的设置面板,如下:
-
- 点击上图红色箭头指向的Auto Import按钮导入Jenny插件,然后上图会多出来几行。
-
- 点击上图中红色箭头指向的Generate按钮。如果是新建的项目可能会有报错提示:
-
- 这时候需要在项目的Assets同级检查一下是否有C#项目工程文件或者C#项目工程文件和下图标识的文件名称是否一直。如果没有只需要在VS或者其他编辑器打开一次项目。如果有但是名称不同只需要在下图的地方修改。然后重新点击Generate按钮生成代码。
-
- 自动生成的代码会在Assets/Generated文件夹下:
Jenny设置面板
这里是Jenny生成代码的过程中的进度条显示或者AssetStore版本可以使用Jenny Server生成代码的进度条显示等其他的一些设置项,我没有深入了解。咱们可以不用管默认就行了。
Project Path 刚才说了C#项目工程文件路径
Target Directory 自动生成代码的路径。
Assemblies 引用程序集的路径,这里的默认值也是Unity自动引用的路径,除非自己修改过
Contexts 需要生成的上下文,后面会介绍上下文
Ignore Namespaces 生成的代码文件名称是否忽略名称空间。
总结:这里主要介绍了一下ECS和Entitas框架。我就是将自己学习过程中的理解写下来,如果有错误的地方欢迎指正。
ECS框架也是短短几句话可以说清楚的。下面是觉得还不错参考:
浅谈《守望先锋》中的 ECS 构架 :https://blog.codingnow.com/2017/06/overwatch_ecs.html
ECS架构简介 :https://johnyoung404.github.io/2019/06/27/ECS%E6%9E%B6%E6%9E%84%E7%AE%80%E4%BB%8B/