加载读取CSV,txt逗号分格值文件

游戏开发中,经常会使用到很多配置文件。适当的利用配置文件,可以有效实现程序设计的灵活性,避免对程序功能的不断修改,降低程序开发人员与策划人员之间的沟通成本,提高效率。

比如以下情景

一个玩家,初始hp200,初始mp200,攻击10

我们可以采用两种方案来完成,

左边 右边
组件里直接写代码
Player.HP=200;
Player.MP=200;
Player.Aggress=10;
ID,MP , HP , Aggress
1 ,200 , 200,10
组件里写代码
Player.HP = GetConfigValue(1,“HP”);
Player.MP=GetConfigValue(1,“MP”);
Player.Aggress=GetConfigValue(1,“Aggress”);

当策划(万恶的策划,本篇的主要反面人物)说哎呀,不行,玩家的初始HP要改成500。

从我们的出发点来衡量:

左边,灾难,玩家要再经历一次下载安装客户端的煎熬。

右边,只要让PlayerConfig更新到客户端,这就可以在玩家重启客户端的时候完成。

左边,不符合资源更新的精神。

右边,符合。

在这里我们写一个读取配置文件的工具类
using UnityEngine;
using System.Collections.Generic;

public class ExcelData
{
    /// <summary>
    /// 读取加载TXT配置文件
    /// </summary>
    /// <param name="cfgName">配置表名称</param>
    /// <param name="DicContent"></param>
    public static void LoadExcelFormCSV(string cfgName, out Dictionary<string, Dictionary<string, string>> DicContent)
    {
        //创建一个TextAsset,通过Resources.Load来加载配置表
        TextAsset tw = Resources.Load("Cfg/" + cfgName) as TextAsset;
        //存放数据表里面的所有内容
        string strLine = tw.text;
        //创建一个字典,用于存放数据表的内容(从配置表第四行读取)//<字段名,字段值(string数组)>
        Dictionary<string, string[]> content = new Dictionary<string, string[]>();
        //开始解析字符串
        ExplainString(strLine, content, out DicContent);
    }
    /// <summary>
    /// 解析字符串
    /// </summary>
    /// <param name="strLine">配置文件字符串</param>
    /// <param name="content">数据表内容</param>
    /// <param name="DicContent"></param>
    public static void ExplainString(string strLine, Dictionary<string, string[]> content, out Dictionary<string, Dictionary<string, string>> DicContent)
    {
        //创建一个字典,用于存放默认值的//<字段名,默认值>
        Dictionary<string, string> initNum = new Dictionary<string, string>();
        //通过换行符来切割配置表里面的内容,使之成为一行一行的数据
        string[] lineArray = strLine.Split(new char[] { '\n' });
        //获取行数
        int rows = lineArray.Length - 1;//最后一行包含换行符,行数需要因此减去1
        //获取列数
        int Columns = lineArray[0].Split(new char[] { ',' }).Length;
        //定义一个数组用于存放字段名
        string[] ColumnName = new string[Columns];
        for (int i = 0; i < rows; i++)
        {
            //每一行数据都根据逗号进行分割,得到一个数组
            string[] Array = lineArray[i].Split(new char[] { ',' });
            for (int j = 0; j < Columns; j++)
            {
                //获取Array的列的值
                string nvalue = Array[j].Trim();
                //第一行字段名
                if (i == 0)
                {
                    //存储字段名
                    ColumnName[j] = nvalue;
                    //实例化字典,长度为rows - 3,因为是从第四行读取
                    content[ColumnName[j]] = new string[rows - 3];
                }
                //if (i == 1)//此时是读到配置表的第二行(字段的注释),不做处理,配置表所填的值,类型都为string
                //{                  
                //}
                else if (i == 2)//第三行默认值
                {
                    //存储对应字段的默认值//<字段名,默认值>
                    initNum[ColumnName[j]] = nvalue;
                }
                else if (i >= 3)//第三行开始是实际数据,存储实际数据
                {
                    //<字段名,字段值(string数组)>
                    content[ColumnName[j]][i - 3] = nvalue;
                    if (nvalue == "")//如果读到的值为空字符,则给予默认值(默认值就是配置表第三行所填的值)
                    {
                        content[ColumnName[j]][i - 3] = initNum[ColumnName[j]];
                        //<字段名,字段值(string数组)>
                    }
                }
            }
        }
        //开始解析
        ExplainDictionary(content, out DicContent);
    }
    /// <summary>
    /// 解析字典中的数据
    /// </summary>
    /// <param name="content"></param>
    /// <param name="DicContent"></param>
    public static void ExplainDictionary(Dictionary<string, string[]> content, out Dictionary<string, Dictionary<string, string>> DicContent)
    {
        //实例化字典//<字段名><<ID><字段值>>
        DicContent = new Dictionary<string, Dictionary<string, string>>();
        //获取字典中所有的键(字段名)
        Dictionary<string, string[]>.KeyCollection Allkeys = content.Keys;
        //遍历所有的字段名
        foreach (string key in Allkeys)
        {
            //实例化一个hasData的字典//<ID,字段值>
            Dictionary<string, string> hasData = new Dictionary<string, string>();
            //获取当前遍历到的key(字段名)所对应的字段值,存到数组里面
            string[] Data = content[key];
            //循环这个数组
            for (int i = 0; i < Data.Length; i++)
            {
                //<ID><字段值>
                hasData[content["ID"][i]] = Data[i];
            }
            //最后给DicContent这个字典赋值
            DicContent[key] = hasData;//<字段名><<ID><字段值>>
        }
    }

}

注释写的非常清楚就再一一解释了,在使用的时候我们需要调用ExcelData.LoadExcelFormCSV("TextCfg",out m_DicLanguageText) 传入我们需要加载的配置文件,第二个参数传入我们的字典 Dictionary<string, Dictionary<string, string>> m_DiclText;

需要注意这里我们的配置文件是存放在Resources/Cfg目录下的

这里写出一个配置文件的例子:

ID,ChineseText,EnglishText
//流水id,//中文,//英文
-1,-1,-1
1,关卡,Level
2,背包,Packsack


当我们需要获取配置表中数据时只需要通过获取字典的键值对方法就可以寄读取了

   /// <summary>
    /// 读取数据的方法
    /// </summary>
    /// <param name="keyWord">字段名</param>
    /// <param name="id">物品ID</param>
    /// <returns></returns>
    public string ReadData(string keyWord,int id, Dictionary<string, Dictionary<string, string>> theDic)
    {
        return theDic[keyWord][id.ToString()];
    }

获取配置表中的数据量:

    /// <summary>
    /// 获得配置表的数据量
    /// </summary>
    /// <param name="theDic">配置表</param>
    /// <returns></returns>
    public int GetInforCount(Dictionary<string, Dictionary<string, string>> theDic)
    {
        int count = 0;
        foreach (KeyValuePair<string,Dictionary<string,string>> item in theDic)
        {
            count = item.Value.Count;
            break;
        }
        return count;
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值