基于元数据的编辑器实现,这篇文章非常好(上)

基于元数据的编辑器实现,这篇文章非常好(上)

今天看到@Funny David 的文章,从Odin 插件讲基于元数据的编辑器实现,这篇文章很不错。

上个评论区有朋友提到了配置中的一个麻烦点,所以我感受了一下,稍微说一下我的思路和处理方法:

847dac6798ee1f8930354858c2bdc4f8.png

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

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

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

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

我们从一开始就关注这个问题并考虑解决方案。主要思想可以概括为:

比如我们使用protobuf序列化配置,保存为二进制配置文件3D道具,代码定义如:

bdd74eadf513c51b92f0d6a21aad375f.png

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

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

40f7c062444469eeef0093303520b469.png

比如我们需要将上图中的uint cmdExtendFrame改为List cmdExtendFramesunity 序列化dictionary,步骤如下

1. 添加一个带有新 ProtoMember id 的新字段

88e19a67869d0028fc9e556a2c933793.png

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

458d3a22a8c11c9b5d4babbbe313b085.png

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

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

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

可以自己编写一个通用的数据处理代码,进行所有涉及到的配置(如所有角色配置)的反序列化、重新序列化、保存等操作。实际上,所有配置都被读取并保存。

4.删除旧字段和反序列化处理代码,得到更新代码

dd1d752f2a5da22b4a972e0e94152b91.png

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

最后,让我说:

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