[Unity3D·CSV篇]04.CSV高级缓存

笨木头  2017-06-11 12:29   Unity3D   阅读(378)   0条评论
转载请注明,原文地址:http://www.benmutou.com/archives/2361
文章来源:笨木头与游戏开发
 

1. 存放所有缓存的字典对象

新的缓存方式也不复杂,也是新建一个缓存类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class CsvDataCached_Higher
{
    /// <summary>
    /// 存放所有CSV数据缓存
    /// </summary>
    public static Dictionary<Type, object> csvDatas = new Dictionary<Type, object>();

    static CsvDataCached_Higher()
    {
        /* 读取并缓存CSV配置数据 */
        csvDatas[typeof(CSVDemo)] = LoadCsvData<CSVDemo>(Application.streamingAssetsPath + "/CSVDemo.csv");
    }

    private static Dictionary<int, T_CsvData> LoadCsvData<T_CsvData>(string csvFilePath)
    {
    }

    public static Dictionary<string, Dictionary<string, string>> LoadCsvFile(string filePath)
    {
    }
}
LoadCsvData和LoadCsvFile和之前是一样的,没有改动,我就不贴出来了。
重点是csvDatas属性,是一个字典,key值是Type类型的对象,value值是object对象。
Type类型即为我们的CSVDemo对象的类型,object对象则保存了CSV文件读取后的数据对象。

 

这个属性有点复杂,可能一时觉得有点别扭。

2. 获取缓存文件的函数

为了方便地获取csvDatas里的对象,我们还需要写1个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   /// <summary>
    /// 获取某个CSV文件的所有数据,返回字典集合,Key为ID,Value为每一行的数据对象
    /// </summary>
    /// <typeparam name="T_CsvData">文件数据类型</typeparam>
    /// <returns></returns>
    public static Dictionary<int, T_CsvData> GetCsvFileDatas<T_CsvData>()
    {
        Type type = typeof(T_CsvData);

        if (csvDatas.ContainsKey(type) == true)
        {
            /* 取出存放该数据对象类型的字典 */
            object dicObj = csvDatas[type];

            return (Dictionary<int, T_CsvData>)dicObj;
        }

        return new Dictionary < int, T_CsvData >() ;
    }
GetCsvFileDatas函数用于从csvDatas属性里获取某个CSV文件的数据对象,用法如下:

1
Dictionary<int, CSVDemo> csvDemoDic = CsvDataCached_Higher.GetCsvFileDatas<CSVDemo>();
于是,这种缓存方式,对于改动是比较友好的,每次新增CSV文件时,我们只需要在静态构造器里多缓存一个类型的数据就可以了。

 

但是,在读取缓存的时候,可能不是很直观,大家看自己的需求了。

3. 获取CSV数据缓存的某一行内容

我们还可以再加一个函数,直接获取某一行的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    /// <summary>
    /// 获取CSV数据对象
    /// </summary>
    /// <typeparam name="T_CsvData">数据对象类型(如MonsterCsvData)</typeparam>
    /// <param name="ID">配置ID</param>
    /// <returns>CSV文件某一行内容的数据对象</returns>
    public static T_CsvData GetCsvLineData<T_CsvData>(int ID)
    {
        Type type = typeof(T_CsvData);

        /* 取出存放该数据对象类型的字典 */
        Dictionary<int, T_CsvData> dic = GetCsvFileDatas<T_CsvData>();

        /* 从字典中取出某个ID的数据 */
        if (dic.ContainsKey(ID) == true)
        {
            return dic[ID];
        }

        return default(T_CsvData);
    }
这个没有太多需要解释的,可有可无的一个函数。

 

最终,木头获取CSV文件数据的方式变成这样:

1
2
3
4
5
        /* 从缓存读取文件 */
        CSVDemo csvData = CsvDataCached_Higher.GetCsvLineData<CSVDemo>(2);

        /* 测试读取ID为2的数据 */
        Debug.Log("ID=" + csvData.ID + ",Name=" + csvData.Name);
日志输入如下:

4.结束

好了,关于CSV的高级缓存方式就介绍到这里。
同时,关于CSV的缓存读取教程也到此为止了。
本教程所有代码请下载:本地下载360云盘下载百度网盘下载CSDN下载
 
这套读取工具更完整、更完善的源码木头也已经发到GitHub上面了:http://www.benmutou.com/archives/2300
这是木头这么久以来都在用的代码(当然也一直在优化),但难免有一些思维固定了,可能关于CSV的缓存和读取会有更方便、更优秀的方式,如果你有的话,希望能留言给我一些建议。

发表评论

电子邮件地址不会被公开。 必填项已用*标注