Unity游戏UI框架(五):配置管理

来源:互联网 发布:系统封装软件 编辑:程序博客网 时间:2024/06/04 19:13

在开发企业级游戏/VR/AR产品时候,我们总是希望可以总结出一些通用的技术体系,框架结构等,为简化我们的开发起到“四两拨千金”的作用。所谓“配置管理”是指一个游戏项目(软件项目),很多需要经常变化的需求或者数据,最好以配置文件的形式存在,从而代替“硬编码”方式。
这里笔者就对游戏产品中大量应用到动态加载的情形,开发出一套通用的配置管理(脚本)工具。该工具可以很方便的对于具备“键值对”特性的配置文件做统一的数据提取处理,特别适合如下应用情形等:

1:“UI预设”/“游戏对象预设”的动态加载。
2:企业级Log 日志系统中关于配置信息(日志的保存路径、日志级别信息)的动态加载。
3:资源(语言)国际化系统中关于语言信息的动态加载。
这里写图片描述

下图给出本UI框架用到的”语言国际化”对应的Json 配置文件:
目前(2017)国际国内普遍采用的配置管理方式主要有两种: XML与Json 方式。
两者各有优缺点:
XML: 对于数据的精确表示、易读性很高。
微软很多的项目都内置对XML作为配置文件的支持。
(例如: 网站项目:ASP.Net、 WinForm 等)
缺点是读写速度慢,这个问题在移动端尤其突出。

Json: 读写速度快,但是易读性没有XML好,但是可以接受。 所以本框架项目都采用Json作为配置文件。

考虑到目前移动端游戏/VR/AR产品的大量应用,所以笔者在此重点介绍基于Json配置文件的数据解析与配置管理。(Json比传统的XML作为配置文件使用,具备解析速度快,文件尺寸小等突出优点)

什么是Json

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

JSON 语法 (JSON 语法是 JavaScript 对象表示语法的子集)
特点:
数据在键值对中,数据由逗号分隔。
花括号保存对象,方括号保存数组。
JSON 数据的书写格式是:名称/值对 “firstName”:”John”
具体示例:
这里写图片描述

Json解析方式

  • 目前解析Json的方式很多各种各样,例如 .NET自带的运行时序列化和反序列化json工具,Unity插件litejson,Unity5.3自带JsonUtility ,以及一些第三方库文件等。

这里使用Unity(5.3以上版本)提供的JsonUtility进行序列化与反序列化

Unity(5.3以上版本)提供的JsonUtility 提供了三个重要方法

  • JsonUtility.ToJson() //表示进行序列化操作,把对象序列化为字符串。
  • JsonUtility.FromJson() ;//表示进行反序列化操作,把Json字符串反序列化为对象。
  • JsonUtility.FromJsonOverwrite();//是覆盖方式进行反序列化。

有了以上技术储备,我们就可以进行开发“通用配置管理器”了。

  1. 定义通用配置管理器接口与辅助类
/// <summary>/// 通用配置管理器接口/// 基于“键值对”配置文件的通用解析/// </summary>public interface IConfigManager{    /// <summary>    /// 只读属性: 应用设置    /// 功能: 得到键值对集合数据    /// </summary>    Dictionary<string, string> AppSetting { get;}    /// <summary>    /// 得到配置文件(AppSeting)最大的数量    /// </summary>    /// <returns></returns>    int GetAppSettingMaxNumber();}[Serializable]internal class KeyValuesInfo{    /// <summary>    /// 配置信息    /// </summary>    public List<KeyValuesNode> ConfigInfo = null;}[Serializable]internal class KeyValuesNode{    /// <summary>    ///    /// </summary>    public string Key = null;    /// <summary>    ///    /// </summary>    public string Value = null;}

2.定义Json 解析异常类,Json 的解析过程如果出错,推荐使用我们自己定义的异常处理,为了更好的发现程序错误

/// <summary>/// Json 解析异常/// 专门负责对于JSon 由于路径错误,或者Json 格式错误造成的异常,进行捕获。/// </summary>public class JsonAnlysisException : Exception {    public JsonAnlysisException() : base() { }    public JsonAnlysisException(string exceptionMessage) : base(exceptionMessage) { }}

3.定义“配置管理器”类,开发实现IConfigManager 接口的通用配置管理器

/// <summary>/// 配置管理器/// 基于Json 配置文件的“配置管理器”/// </summary>public class ConfigManagerByJson : IConfigManager{    /// <summary>    /// 保存(键值对)应用设置集合    /// </summary>    private static Dictionary<string, string> _AppSetting;    /// <summary>    /// 只读属性: 得到应用设置(键值对集合)    /// </summary>    public Dictionary<string, string> AppSetting    {        get        {            return _AppSetting;        }    }    /// <summary>    /// 构造函数    /// </summary>    /// <param name="jsonPath">Json配置文件路径</param>    public ConfigManagerByJson(string jsonPath)    {        _AppSetting = new Dictionary<string, string>();        //初始化解析Json 数据,加载到(_AppSetting)集合。        InitAndAnalysisJson(jsonPath);    }    /// <summary>    /// 初始化解析Json 数据,加载到集合众。    /// </summary>    /// <param name="jsonPath"></param>    private void InitAndAnalysisJson(string jsonPath)    {        TextAsset configInfo = null;        KeyValuesInfo keyValuesInfoObj = null;        if (string.IsNullOrEmpty(jsonPath)) return;        //解析Json配置文件        try        {            configInfo = Resources.Load<TextAsset>(jsonPath);            keyValuesInfoObj = JsonUtility.FromJson<KeyValuesInfo>(configInfo.text);        }        catch         {            throw new JsonAnlysisException(GetType() + "/InitAndAnalysisJson()/Json Analysis Exception ! Parameter jsonPath=" + jsonPath);        }        //数据加载到AppSetting 集合中        foreach (KeyValuesNode item in keyValuesInfoObj.ConfigInfo)        {            _AppSetting.Add(item.Key, item.Value);        }    }    /// <summary>    /// 得到AppSetting 的最大数值    /// </summary>    /// <returns></returns>    public int GetAppSettingMaxNumber()    {        if (_AppSetting != null && _AppSetting.Count >= 1)        {            return _AppSetting.Count;        }        else        {            return 0;        }    }}

代码说明:
以上定义的“配置管理器”,可以对所有具备“键值对”特性的Json 配置文件,做统一数据提取工作,从而对于“UI预设”、“游戏对象”、“日志配置文件”、“语言国际化”等信息,可以做统一处理,极大提供开发效率。

“UI预设” 路径信息Json配置文件,提供参考

{"ConfigInfo":[{"Key":"UI预设路径"},{"Key":"LogonStart","Value":"Prefab/UI/Login/LogonStart"}]}

使用参考,在UIManger.cs中,UI界面预设的路径都是从配置表中读取的

/// <summary>    /// 初始化“UI窗体预设”路径数据    /// </summary>    private void InitUIFormsPathsData()    {        //先写简单的,后面我们使用Json做配置文件,来完善。        if (_DicFormsPaths != null)        {            IConfigManager configMgr = new ConfigManagerByJson(SysDefine.SYS_PATH_UIFORMS_CONFIG_INFO);            if (configMgr != null)            {                _DicFormsPaths = configMgr.AppSetting;            }        }    }

转载地址:刘老师讲Unity

原创粉丝点击