美文网首页Unity技术分享Unity游戏开发入门
[项目组] 配置表解析升级指南

[项目组] 配置表解析升级指南

作者: 苏三疯 | 来源:发表于2016-12-21 15:47 被阅读149次
    ORM.png

    目的与好处

    • 不依赖于具体存储格式, 统筹表格格式差异(xml和csv)
    • 有报错机制: 能够清楚指出 某表.某行.某列 数据有误, 或格式有误, 能统一弹出提示窗口, 让策划自己玩耍.
    • 简化代码, 逐步统一所有配置表处理代码与风格.
    • 类型自动转换, 支持[所有基本数据类型], 以及枚举, Vector2, Vector3, 数组(可自定义分隔符, 默认'|', 可配置)

    迁移代价

    • 需要使用上进行适应, 习惯新的方式, 对无法满足的需求进行指出.
    • 特殊类型转换代码依然需要自行从原代码中copy出来, 只是换了另一种方式.
    • 改动还是有工作量在, 而且需要细心迁移, 注意检测结果.

    操作细则:

    DriverLicenseVo, SeasonRankInfo为例: DriverLicenseConfig.xml, rank_match.xml

    1.配置类继承 DBaseInfoDUniqueInfo, 使用特性[TableFile]
    // 无唯一ID
    [TableFile(Name = "DriverLicenseConfig.xml")]
    public class DriverLicenseVo : DBaseInfo
    // 有唯一ID, 需要填写PK(主键)字段的名词, 对应xml中某唯一列
    [TableFile(PK = "Rank", Name = "rank_math.xml")]
    public class SeasonRankInfo : DUniqueInfo
    
    #特性说明:
    - PK: 主键名
    - Name: 配置文件全名
    #基类说明:
    - DBaseInfo: 无唯一列的数据类继承
    - DUniqueInfo: 有唯一列的数据类继承, 需要填写PK列名
    
    2.特殊需求

    类型处理不能满足:

    #DriverLicenseVo.cs
    // 原始数据需要拼接一段字符串, 才进行枚举转换"License"
    [TableColumn(Name = "driverLevel")]
    private string _driverLevel
     {
          set { driverLevel = (DriverLevelType)Enum.Parse(typeof(DriverLevelType), "License" + value); } 
    }
    // 驾照等级
    public DriverLevelType driverLevel = DriverLevelType.None;
    
    • 说明: 设置了[TableColumn(Name = "driverLevel")] 中的Name优先于字段原名.
      所以可以写一个private的setter, 进行类型转换处理
    3.配置类修改说明
    • 1.属性名称与xml字段同名: xml的AttributeName对应类的FieldName, 会直接进行赋值.
    # DriverLicenseVo.cs
        // 驾照标题
        public string title = null;
        <item ... title="新手教程" ...></item>
    
        title大小写完全一致最省事, 什么都不用配置
    
    • 2.如果属性名字与xml中的不对应
      使用特性[TableColumn(Name = "数据列名称")]来指定.
    # SeasonRankInfo.cs
        // 段位描述
        [TableColumn(Name = "Describe")]
        public string des = string.Empty;
        <item ... Describe="青铜" ...></item>
    
        特别注意xml中存在英文单词拼写错误, 导致与类中字段名不一致的情况
    
    • 3.若需要进行"string".Split(',')进行处理的数组类型, 则使用特性[TableColumn(Sp = ",")]来指定.
    # DriverLicenseVo.cs
        [TableColumn(Sp = ",")]
        // 机器人名称
        public string[] robotNames = null;
    
      // 上面配置相当于旧代码:
        vo.robotNames = table["robotNames"].ToString().Split(',');
    
    4.加载代码添加泛型参数:
    • 1.在ConfigLoader.InitLoaderQueue配置加载入口处, 修改代码如下:
    LoadConfig<DriverLicenseVo>(...);
    LoadConfig<SeasonRankInfo>(...);
    
    • 2.多表合一需要多传一个参数
    LoadConfig<SectionIndexTableVo>(ConfigPath.PVE_CONFIG, "SectionName", LoadMode.NetFirst);
    

    SectionName 就是多表中的子节点名, 一张表有多少个子表, 就要写几行, 只是类名不同, 子表名称不同

    4.XmlOperation中xml转vo的代码, 修改为
    参考 XmlOperation.LoadXMLDriveringLicenseCofing:
    // 获取整个表格List
    List<DriverLicenseVo> vos = TableReader.GetInfos<DriverLicenseVo>();
    
    参考 XmlOperation.LoadXMlMatchRankInfo:
    // 根据id获取单条记录 [继承DUniqueInfo才能使用此API]
    DriverLicenseVo vo = TableReader.GetInfo<DriverLicenseVo>(id);
    

    整理过程如遇到困难, 需要扩展功能, 欢迎提出需求。

    相关文章

      网友评论

      本文标题:[项目组] 配置表解析升级指南

      本文链接:https://www.haomeiwen.com/subject/uqhqvttx.html