尝试 2 天 Unity ECS 记录

       现在跟朋友在以前做战棋类游戏,由于在第一家棋牌公司深受 MVC 的影响,现在做项目都极大地希望把数据和显示分离。五一前把基本的移动和战斗功能写出来后,五一期间家里有事也没空开发,就搜了些 unity 框架之类的文章看看。发现 ECS 模式挺对我胃口的,就着手尝试把之前写的基本功能改成 ECS 模式开发。出于个人比较懒笔记做得比较少,知识点都是扒下来直接用的,出处也忘记是哪里了,各位大佬还请见谅。

        下载 Entities 以及其他相关插件就不多说了。起初,为了方便上手,选择使用 HybridECS 模式,即还是使用 GameObject 挂载 MonoBehavior 脚本作为代理,同时挂载一个 ConvertToEntity 脚本。在代理脚本中声明 Entity 中的 ComponentData 。

        本来以为这种模式还是能混合 GameObject 使用的话会挺顺利的,但是目前 unity 对 ECS 中的诸多不支持是我没想象到的。例如:

       1.ComponentData 的成员不支持一切可以为 Null 的类型,不仅是 结构体 和 类,数组和列表等容器也不行。由于项目中需要使用数组存储地图,所以这点挺关键的。

       2.Unity 目前的碰撞体和动画机对 ECS 还没有支持。我需要做一个鼠标点击 3D 场景的响应,所以射线碰撞必不可少。本来以为使用 HybridECS 的话这个不会是什么问题,着手实现后才发现即便在 HybridECS 当中,由于第 1 点所以 Entity 也无法获得碰撞体。想起来在B站的 Unity官方 发布的视频中,达叔有做一个使用 ECS 开发《我的世界》的教程,里面需要动态制造和销毁砖块,回去再翻看一遍。发现达叔对碰撞体也是很头疼,制造砖块还好,射线碰撞的响应不需要用到碰撞体对应 Entity,但是销毁砖块就要销毁对应碰撞体的 Entity。

       达叔的解决方法是,销毁的时候在相同的坐标,产生一个新的、含有销毁标签的 Entity,然后遍历场景中所有砖块的 Entity,如果坐标相同则销毁。同时为了销毁在砖块上的物件,也要遍历场景中所有物件的 Entity,如果坐标相同则销毁(为什么这个也要遍历也是由于第 1 点)。这样一套逻辑下来要嵌套三个循环,虽然有一个循环应该只要执行一遍,但是也是相当麻烦。

       综合以上,我们的项目也不需要多大的性能优化,只是想做数据分离也有其他方法,权衡之后还是放弃了对 ECS 的使用。虽然不继续使用了,但是即便不说性能优化, ECS 的设计模式还是很迷人的。System 如同大自然的物理法则,只要 Entity 的 Component 在这个法则当中,Entity 就受制于这个法则。个人认为所有游戏都是对现实世界的模拟和扩展,这种面向数据在我看来,就是比之面向对象更进一步的对现实世界模拟。

       菜鸟一个,随笔记录,内容侵删。

你可能感兴趣的:(Unity3D)