贺老师 发表于 2020-12-2 13:03

Unity2019.3 DOTS代码简化笔记

跳转至专题目录
专题推荐文章:


localPosition与anchoredPosition转化 unity Scene View扩展之编辑器扩展总结Unity获取鼠标点击ui GameObject
本系列目录

DotsSample笔记 Unity2019.3 DOTS代码简化笔记 ECSSamples的Boids鱼群例子笔记
一、最新DOTS更新大幅减少了所需要的写的样板代码

属性替换自定义创建组件Entities.ForEach()替换IJobForEach和IJobForEachWithEntity构造
我们以下面这么一个例子,来介绍一下,现在DOTS是怎么完成瘦身的。
这是2019.3之前一个让物体运动的ECS代码
这是一段让物体移动的ECS代码


以前的代码,分成下面3步
1、创建一个Component
2、创建一个MonoBehaviour,继承IConvertGameObjectToEntity接口,使持有这个Component的GameObject,转换成一个持有Velocity IComponentData的Entity。
3、为了让持有IComponentData的Entity动起来,需要创建一个管理这些组件的System
4、如果用到JobSystem,那么,就需要一个处理数据的Job
5、Job要真正运行起来,就需要在System中的Update中,用Schedule执行


经过上面一个例子发现,其实,只有这么两处代码,才是我们需要关心的,其他代码通通都是模板代码
现在,我们要开始瘦身了。
1、既然IConvertGameObjectToEntity这个接口,与IComponentData是冗余的,那么,就可以考虑去掉IConvertGameObjectToEntity,给IComponentData添加上一个属性,让Unity知道,这个IComponentData是可以被挂载到GameObject上的。
2、用Entities.ForEach来替换Job创建、执行的代码,简化Job相关代码。
不过,用lambuda表达式会带来GC,Unity官方下一步就是要优化掉这一部分的GC。即使如此,现在这么些,还是会很好地配合JobSystem和Burst Compiler高效地执行。
最后,我们比较一下,前后写代码DOTS代码所需要的工作量。
左边为Unity2019.3的,右边是以前版本的。
很明显,现在的工作量大大减少了。
再举个例子,下面这个PaddleInputData,挂上GenerateAuthoringComponent之后,就可以在Inspector里面添加对应的组建了,设置参数,也会修改到对应的Entity上了。
参考


[*]^[天天直播] 运用DOTS还原经典游戏《Pong》(上)https://www.bilibili.com/video/BV1M7411t7Ai/?spm_id_from=333.788.videocard.0
页: [1]
查看完整版本: Unity2019.3 DOTS代码简化笔记