Unity中配置系统经验谈

这里总结一下,自己使用Unity以来的心得,大部分属于随手解决但还有印象或者觉得效果不错。

这个小工具能够在项目早期快速地引入配置系统,并且修改起来也非常迅速,能够实时预览修改结果。该系统支持默认参数、支持整形、浮点、字符串、数组、结构体。并且由于Xml序列化的可靠性从而十分健壮,容易调试。还很容易进行压缩加密等等操作,但这里不讲这些。

为什么不用json等其他格式?我个人认为xml可读性更好(个人偏好)。里面微小的性能差异很难构成瓶颈。

序列化工具XmlSerializer

Xml是每门语言都会有解析库可以直接拿来用,这里演示一下C#的情况。 这个工具在项目早期,能够非常快速地构建起一套配置系统,比如技能模板文件。

首先写个xml文件

	
<SkillTemplate>
<StageList>
<Stage Interruptible="true">
<Foo>1</Foo>
</Stage>
<Stage>
<Foo>2</Foo>
</Stage>
</StageList>
</SkillTemplate>

然后定义一个结构体

[XmlRoot("SkillTemplate")]
public class SkillTemplate
{
[XmlArray("StageList"),XmlArrayItem("Stage")]
public SkillTemplateStage[] StageList;
}

[XmlRoot("Stage")]
public class SkillTemplateStage
{
[System.ComponentModel.DefaultValue(0)]
public int Foo;

[System.ComponentModel.DefaultValue(false)]
[XmlAttribute("Interruptible")]
public bool Interruptible;
}

读取非常简单,比如加载一个技能模板

var serializer = new XmlSerializer(typeof(SkillTemplate));
var stream = new FileStream(name, FileMode.Open);
var container = serializer.Deserialize(stream) as SkillTemplate;
stream.Close();
return container;

保存也是

        
var serializer = new XmlSerializer(typeof(SkillTemplate));
var stream = new FileStream(name, FileMode.Create);
serializer.Serialize(stream, st);
stream.Close();

Debug版本可以放弃缓存,那么每次都重新加载能够实时预览修改。

基于此再结合Timeline工具做个技能编辑器就很简单了。

有同学说XmlSerializer会有性能问题,但我的Profile里面所有技能文件都热加载也没出现卡顿。假如在更大的规模下发现了,那么也很容易进行替换成另一套序列化系统。

将Excel转为Xml

后续可以将Excel也纳入Xml中统一处理,在Unity商店中有很多免费的Excel处理工具,也可以用Python撸一个。

这样,Excel同样也支持Xml所支持的功能,比如整形、浮点、字符串、数组、结构体等等。

字段汉化、路径复用等等也支持,都可以通过Excel自身公式轻松解决。

和别的方案对比

配置工具把工序拆开,可以大致分为:

  • 输入:元数据、可读的数据
  • 输出:生成代码、生产数据

在过去工作流是这样的:

需要改字段->改Excel->改元数据->后台统一导出二进制&代码->客户端拉取编译错误->修复编译错误&逻辑问题

现在是这样的:

需要改字段->改Excel->全后端各自写代码

总的来讲,这个方案就是定义的代码就是元数据,前后端各自定义自己关心的结构体即可,不定义就不读取。对比常见的配置系统,不需要改Excel之后再改元数据,然后再改代码。并且不用单独学习元数据语法。




转载标明原文链接:jjyy.guru/unity-xml


你可能还喜欢: