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

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

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

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

  1. public class CsvDataCached_Higher
  2. {
  3.     /// <summary>
  4.     /// 存放所有CSV数据缓存
  5.     /// </summary>
  6.     public static Dictionary<Type, object> csvDatas = new Dictionary<Type, object>();
  7.     static CsvDataCached_Higher()
  8.     {
  9.         /* 读取并缓存CSV配置数据 */
  10.         csvDatas[typeof(CSVDemo)] = LoadCsvData<CSVDemo>(Application.streamingAssetsPath + "/CSVDemo.csv");
  11.     }
  12.     private static Dictionary<int, T_CsvData> LoadCsvData<T_CsvData>(string csvFilePath)
  13.     {
  14.     }
  15.     public static Dictionary<string, Dictionary<string, string>> LoadCsvFile(string filePath)
  16.     {
  17.     }
  18. }
LoadCsvData和LoadCsvFile和之前是一样的,没有改动,我就不贴出来了。
重点是csvDatas属性,是一个字典,key值是Type类型的对象,value值是object对象。
Type类型即为我们的CSVDemo对象的类型,object对象则保存了CSV文件读取后的数据对象。

 

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

2. 获取缓存文件的函数

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

  1.    /// <summary>
  2.     /// 获取某个CSV文件的所有数据,返回字典集合,Key为ID,Value为每一行的数据对象
  3.     /// </summary>
  4.     /// <typeparam name="T_CsvData">文件数据类型</typeparam>
  5.     /// <returns></returns>
  6.     public static Dictionary<int, T_CsvData> GetCsvFileDatas<T_CsvData>()
  7.     {
  8.         Type type = typeof(T_CsvData);
  9.         if (csvDatas.ContainsKey(type) == true)
  10.         {
  11.             /* 取出存放该数据对象类型的字典 */
  12.             object dicObj = csvDatas[type];
  13.             return (Dictionary<int, T_CsvData>)dicObj;
  14.         }
  15.         return new Dictionary < int, T_CsvData >() ;
  16.     }
GetCsvFileDatas函数用于从csvDatas属性里获取某个CSV文件的数据对象,用法如下:

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

 

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

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

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

  1.     /// <summary>
  2.     /// 获取CSV数据对象
  3.     /// </summary>
  4.     /// <typeparam name="T_CsvData">数据对象类型(如MonsterCsvData)</typeparam>
  5.     /// <param name="ID">配置ID</param>
  6.     /// <returns>CSV文件某一行内容的数据对象</returns>
  7.     public static T_CsvData GetCsvLineData<T_CsvData>(int ID)
  8.     {
  9.         Type type = typeof(T_CsvData);
  10.         /* 取出存放该数据对象类型的字典 */
  11.         Dictionary<int, T_CsvData> dic = GetCsvFileDatas<T_CsvData>();
  12.         /* 从字典中取出某个ID的数据 */
  13.         if (dic.ContainsKey(ID) == true)
  14.         {
  15.             return dic[ID];
  16.         }
  17.         return default(T_CsvData);
  18.     }
这个没有太多需要解释的,可有可无的一个函数。

 

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

  1.         /* 从缓存读取文件 */
  2.         CSVDemo csvData = CsvDataCached_Higher.GetCsvLineData<CSVDemo>(2);
  3.         /* 测试读取ID为2的数据 */
  4.         Debug.Log("ID=" + csvData.ID + ",Name=" + csvData.Name);
日志输入如下:

4.结束

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

------点一点广告,支持笨木头------

发表评论

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