现在跟朋友在以前做战棋类游戏,由于在第一家棋牌公司深受 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 开发《我的世界》的教程,里面需要动态制造和销毁砖块,回去再翻看一遍。发现达叔对碰撞体也是很头疼,制造砖块还好,射线碰撞的响应不