Unity中xml配置表管理器

发表于2019-01-25
评论0 3.5k浏览
本篇内容主要给大家分享下在Unity开发者中xml配置表管理器的使用,核心思想是使用反射把配置表中的数值赋给对象的属性。

直接上代码,代码里有比较详细的注释:
public static List<T> Load<T>() where T : new(){
		//这里要注意配置对象要与配置文件名称相同
		string[] names = (typeof(T)).ToString().Split('.');
        //获取真实名称
		string filename = names[names.Length - 1];
		XmlDocument doc = new XmlDocument();
        //加载xml文件
        string data = Resources.Load("Config/"+filename).ToString(); 
        doc.LoadXml(data); 
        XmlNode xmlNode = doc.DocumentElement;
		XmlNodeList xnl = xmlNode.ChildNodes;
		List<T> ret = new List<T>();
        //遍历所有内容
		foreach (XmlNode xn in xnl)
		{
            //找到符合条件的数据
			if (xn.Name.ToLower() == filename)
			{
                //实例化数据对象
				T obj = new T();
				Type t = obj.GetType();
                //获取对象的全部属性
				FieldInfo[] fields = t.GetFields();
				string msg = "";
				try{
                    //遍历全部属性,并从配置表中找出对应字段的数据并赋值
                    //根据属性的类型对数据进行转换
					foreach (FieldInfo field in fields){
                        if(xn.Attributes[field.Name] == null){
                            Debug.Log("the field [" + field.Name + "] is null !!!");
                            continue;
                        }
						string val = xn.Attributes[field.Name].Value;
						if(val == null){
							Debug.Log("the field [" + field.Name + "] is null !!!" );
							continue;
						}
						msg = field.Name + " : "+  val + "   type : " + field.FieldType;
                        if (field.FieldType == typeof(int))
                        {
							field.SetValue(obj, int.Parse(val));
                        }
                        else if (field.FieldType == typeof(float))
                        {
                            field.SetValue(obj, float.Parse(val));
                        }
                        else if (field.FieldType == typeof(string))
                        {
                            field.SetValue(obj, val);
                        }
					}	
					ret.Add(obj);
				}catch(Exception e){
					Debug.LogError("=====================" + filename + "==================");
					Debug.LogError(e.Message);
					Debug.LogError(msg);
				}
			}
		}
		return ret;
	}

使用方法

现在有这样一张配置表:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<role_confs>
<role_conf id="20003" name="box3" description="啊啊啊" file_path="Box003" unlock_type="-1" unlock_price="200" />
<role_conf id="20004" name="box4" description="啊啊啊" file_path="Box004" unlock_type="1" unlock_price="200" />
<role_conf id="20005" name="box5" description="啊啊啊" file_path="Box005" unlock_type="1" unlock_price="200" />
<role_conf id="20006" name="box6" description="啊啊啊" file_path="Box006" unlock_type="1" unlock_price="200" />
</role_confs>

首先定义数据类,注意数据类的名称要与配置表文件一致,则对应的数据类应该是这样的:
public class role_conf
{
    public int id;   
    public string name;  
    public string description;  
    public string file_path;     
    public int unlock_type; 
    public int unlock_price;  
}

加载数据:
List<role_conf> _datas = Load<role_conf>();

这样,xml表中的每一个数据就对应list中的一个对象了。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引