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]
[cce_cs]
/* 从缓存读取文件 */
CSVDemo csvData = CsvDataCached_Higher.GetCsvLineData<CSVDemo>(2);
/* 测试读取ID为2的数据 */
Debug.Log("ID=" + csvData.ID + ",Name=" + csvData.Name);
[/cce_cs]
4.结束
好了,关于CSV的高级缓存方式就介绍到这里。
同时,关于CSV的缓存读取教程也到此为止了。
这是木头这么久以来都在用的代码(当然也一直在优化),但难免有一些思维固定了,可能关于CSV的缓存和读取会有更方便、更优秀的方式,如果你有的话,希望能留言给我一些建议。