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

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

新的缓存方式也不复杂,也是新建一个缓存类:
[cce_cs]
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)   {   } } [/cce_cs]
LoadCsvData和LoadCsvFile和之前是一样的,没有改动,我就不贴出来了。
重点是csvDatas属性,是一个字典,key值是Type类型的对象,value值是object对象。
Type类型即为我们的CSVDemo对象的类型,object对象则保存了CSV文件读取后的数据对象。
 
这个属性有点复杂,可能一时觉得有点别扭。

2. 获取缓存文件的函数

为了方便地获取csvDatas里的对象,我们还需要写1个函数:
[cce_cs]
   /// <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 >() ;   } [/cce_cs]
GetCsvFileDatas函数用于从csvDatas属性里获取某个CSV文件的数据对象,用法如下:
[cce_cs]Dictionary<int, CSVDemo> csvDemoDic = CsvDataCached_Higher.GetCsvFileDatas<CSVDemo>();[/cce_cs]
于是,这种缓存方式,对于改动是比较友好的,每次新增CSV文件时,我们只需要在静态构造器里多缓存一个类型的数据就可以了。
 
但是,在读取缓存的时候,可能不是很直观,大家看自己的需求了。

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

我们还可以再加一个函数,直接获取某一行的内容:
[cce_cs]
    /// <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);   } [/cce_cs]
这个没有太多需要解释的,可有可无的一个函数。
 
最终,木头获取CSV文件数据的方式变成这样:
[cce_cs]
        /* 从缓存读取文件 */
        CSVDemo csvData = CsvDataCached_Higher.GetCsvLineData<CSVDemo>(2);

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

4.结束

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

本博客基于 BlazorAnt Design Blazor 开发