Unity引用prefab_19:重构Unity配置数据(序列化)

Unity引用prefab_19:重构Unity配置数据(序列化)

今天看到@Funny David 的文章,讲了从Odin 插件实现基于元数据的编辑器,非常好。

上个评论区有朋友提到了配置中的一个比较麻烦的点unity 序列化什么意思,所以我感受了一下,稍微说一下我的想法和处理方法:

d5f73dfdf324aaeb7d56ba0172bf0397.png

当我们使用Unity自带的数据序列化时,当我们需要更改字段名、字段类型,甚至整个配置的数据格式和级别时,就会面临丢失数据的问题。在制作游戏的过程中,我们经常会根据需求的变化而面临这样的问题,需要及时重构我们的配置数据和代码结构。

可能的要求的简要列表如下:

以上需求在我目前的项目中都遇到过。随着我们技能编辑器功能的逐渐复杂化、修改和优化,这是不可避免的。

我们需要让数据结构合理的满足我们逻辑需求的变化,同时还要保证重构过程中没有数据丢失。我们不能因为我们更改了代码而使规划遭受大量配置重新配置的成本。

一开始,我们就关注这个问题并考虑解决方案。主要思想可归纳如下:

例如我们使用protobuf将配置序列化,保存为二进制配置文件,代码定义如:

9c751ecc050fec42f9004ce2973488ab.png

protobuf根据ProtoMember设置的id对字段进行序列化和反序列化,所以修改字段名完全不会影响数据。

如果涉及到以下变更的要求,则为统一处理方式UI界面,例如:

e5b40393f5352a8646f47fbfbc1aea11.png

例如我们需要将上图中的uint cmdExtendFrame改为List cmdExtendFrames,步骤如下

1、为新的ProtoMember id添加一个新字段

9a3052626cbab7e8f112ce2a82be3e2a.png

2、protobuf反序列化后,对旧字段和新字段进行转换赋值

5326791863c57e89d1955cb26f986a55.png

3、最重要的一步:先反序列化原始数据,再序列化成新数据,保存为新数据。

反序列化的时候会进行第2步的赋值处理(这里可以根据需要任意处理)。

序列化成新数据,新数据会包含cmdExtendFrame和cmdExtendFrames这两个字段的数据。

您可以自己编写通用的数据处理代码,对涉及的所有配置(如所有角色配置)执行反序列化、重新序列化和保存操作。事实上unity 序列化什么意思,所有配置都被读取并保存。

4、删除旧字段和反序列化处理代码得到更新后的代码

4e302deaa45f8a029ae0f6eb81c3ac73.png

通过以上四个步骤,可以任意修改配置数据的类型和格式,是游戏不断重构的利器。并且不会造成任何数据丢失。配合Odin或AdvancedInspector等插件,做一些编辑器非常方便。

最后:

希望能给你带来一些帮助,谢谢。