日期:2023-8-7
前阵子项目在提测,迭代就比较快了,没顾上更新。
提一个老生常谈的话题,数据配置。
一般来说,都是策划去做,或者是Excel,或者是服务器甩过来。
我们这里,主要讨论网络数据的对接,本地Excel也同理。
那么,Dots如何去做?
官网的例子,是Bake 。
Unity将Bake分为两个流程,创作模式、运行模式。
创作模式,是人类易于阅读、修改。
运行模式,对性能更优好。
Bake模式的特殊性,便是难点所在了。
创作模式中,外部静态Static无法使用,仅常量Const可以。
同时,Bake模式,打包后无法修改。仅在编辑器生效,EditorBuild过程中,就处理完成。
那么策划编辑的数据,如何应用?
将问题拆分成2步。1,数据的存取、读取方式。2,应用的阶段。
1,首先要思考,Dots可以读取什么样的外部数据。
常量、静态数据。
同时包括 PlayerPrefs 中的数据,对的,将数据用Json存到本地,再去读取。
2,那么什么阶段应用。
Bake中,是无法了。只能选择Bake后
思考一个问题,实例化对象时,我们做了什么。
EntityManager.Instance (Entity),对吧。
我们复制了Entity,但是,Entity是不包含数据的,他仅仅包含了索引,那么,我们实际想修改的便是 Entity所关联的数据,也就是CompoentData。
接下来的思路便是,如何拿到Entity对应的ComponentData,并修改其关联的数据。
1,Bake时,我们将Prefab,转化成Entity,集中在一个单例组件中,例如:PrefabComponentData。
2,网络数据加载完成后,先转为Json,存在PlayPrefs中。
PlayPrefs的key,可以为int,跟 Prefab 对应的枚举做关联。
3,通过单例组件获取 Entity
(SystemAPI. GetSingle<T>().GetEntity()),
4,再获取对应的 Component 。
( Component DataT = EntityManager.GetCompoentData())
5,对应PlayerPrefs中的数据,修改拷贝的 Component
6, 将修改后的ComponentData 重新关联给 单例组件中的 Entity。
( EntityManager.SetCompoentData( DataT,Entity))
这里讲一下,为什么需要重新关联:
因为 ComponentData为值类型数据,并不是引用类型。
源于ECS高效的内存管理,EntityManager.GetCompoentData() 获取的过程是复制,不是引用,并不会对原数据造成影响。
所以,我们还需要将修改后的Compoent,重新关联给Entity。