Config配置管理器
using System.Collections.Generic;
using UnityEngine;
using System.Xml;

public class ConfigManager : Manager  {

    private Dictionary<string, object> configs;

    public override void Init()
    {
        //获取到Resources/Config下的所有配置文件 并且解析

        configs = new Dictionary<string, object>();

        TextAsset[] textAsset = Resources.LoadAll<TextAsset>("Config");
        for(int i =0;i<textAsset.Length;i++)
        {
            AnalysisConfig(textAsset[i]);
            Resources.UnloadAsset(textAsset[i]);
        }
        
        GameManager.Instance.DebugManager.Logic.Log("配置管理器初始化完成!");
    }

    //加载解析xml配置
    private bool AnalysisConfig(TextAsset file)
    {
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(file.text);
        XmlNode parent =  xml.FirstChild;

        string FileKey = file.name;
        if (configs.ContainsKey(FileKey)){
            GameManager.Instance.DebugManager.Error.Log("配置文件名不能重复!");
            return false;
        }
        
        Dictionary<string, object> FileNode = new Dictionary<string, object>();
        FileNode = ParseNode(parent) as Dictionary<string,object>;
        configs.Add(FileKey, FileNode);
        
        return true;
    }

    private object ParseNode(XmlNode node)
    {
        object newNode = new object();
        
        XmlNodeList list = node.ChildNodes;
        if (list.Count > 0 && list[0].Name != "#text")
        {
            //数组
            Dictionary<string, object> dic = new Dictionary<string, object>();
            foreach (XmlNode cNode in list)
            {
                object ccNode = new object();
                ccNode = ParseNode(cNode);
                if (dic.ContainsKey(cNode.Name)) {
                    GameManager.Instance.DebugManager.Error.Log(string.Format("同一个父节点下的子节点的标签名不能相同:{0}", cNode.ParentNode.Name + cNode.Name));
                    return null;
                }
                dic.Add(cNode.Name, ccNode);
            }
            
            newNode = dic;

        }
        else {
            //单元素数据 退出点
            newNode = node.InnerText;
        }


        return newNode;
    }

    /// <summary>
    /// 格式:配置文件名.根节点下的子节点.根节点下的子节点的子节点
    /// 注意不需要写根节点的标签名
    public T GetConfigByKey<T>(string key)
    {
        string[] keys = key.Split('.');
        if (!configs.ContainsKey(keys[0]))
        {
            GameManager.Instance.DebugManager.Error.Log(string.Format("缺少{0}的配置文件", keys[0]));
            return default(T);
        }
        Dictionary<string, object> dic = configs[keys[0]] as Dictionary<string, object>;
        object TargetNode = dic;
        

        for (int i = 1; i < keys.Length; i++)
        {
            
            dic = TargetNode as Dictionary<string, object>;//往前推进
            if (!dic.ContainsKey(keys[i])) {
                GameManager.Instance.DebugManager.Error.Log(string.Format("缺少{0}节点", keys[i]));
                return default(T);
            }

            TargetNode = dic[keys[i]];
        }
        
        return (T)TargetNode;
    }

}


启动的时候,将指定Resources/Config目录的配置文件一并解析到内存中,通过key的方式获取到配置信息

需要添加配置,只需要在Resources/Config目录下创建配置文件就行了,自己再根据格式获取到配置,用于一些不用经常修改的、轻量的配置

如果是一些需要经常修改,重量的,使用网络AssetBundle加载。

思路:来自于php laravel的配置


首页 我的博客
粤ICP备17103704号