unity学习(五):Excel表格读取和数据类生成

idpetNamepetAvtdescription
stringstringstringstring
1软绵绵PetAvt1一只可爱的小绵羊,但是千万不要被它的外表所迷惑
2鸵鸟-KLPetAvt2理想城中的机械宠物,能够辅助赛车手进行比赛
3军火猪PetAvt4一只暴躁的虎皮猪,总是横冲直撞的破坏着

表格格式固定,第一行数据名 ,第二行数据类型,

第一行和第一列为非重复数据,防止读取冲突

1、选取表格,另存为.csv文件,生成的.csv需要转换为UTF-8格式,不然读取会有问题 

2、生成解析csv窗口

Editor/CreatConfigDataFile.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
/// <summary>
/// Excel表格的解析窗口
/// </summary>
public class CreatConfigDataFile : EditorWindow {

    static string writePath = "/Scripts/GameConfigs/";
    static Object selectObj;


    [MenuItem("framework/打开配置Excel表格的解析窗口")]
    static void ByWindow()
    {
        CreatConfigDataFile window = EditorWindow.GetWindow<CreatConfigDataFile>();
    }

    private void OnGUI()
    {
        GUILayout.Label("设置配置数据文件的生成路径");
        writePath = GUILayout.TextField(writePath);
        GUILayout.Label("请选择一个合法的CSV文件");

        if (GUILayout.Button("生成C#协议文件"))
        {
            Debug.Log("生成C#协议文件----------");
            if (selectObj != null)
            {
                CreatConfigUitl.CreatConfigFile(selectObj, writePath);
            }

        }

        if (Selection.activeObject != null)
        {
            string path = AssetDatabase.GetAssetPath(Selection.activeObject);
            if (path.ToLower().Substring(path.Length - 4, 4) == ".csv")
            {
                selectObj = Selection.activeObject;
                GUILayout.Label(path);

            }
        }
    }

    private void OnSelectionChange()
    {
        Repaint();
    }



}

 

 3、读取csv,并自动生成对应数据类

using UnityEngine;
using System.Collections;
using System;
using System.Text;
using System.IO;

/// <summary>
/// CSV 读写
/// </summary>
public class CsvStreamReader
{
	private  ArrayList  rowAL;       //行链表,CSV文件的每一行就是一个链
	private  string  fileName;       //文件名
	
	private  Encoding encoding;       //编码
	
	/// <summary>
	///
	/// </summary>
	/// <param name="fileName">文件名,包括文件路径</param>
	public CsvStreamReader(string fileName)
	{
		this.rowAL = new ArrayList();
		this.fileName = fileName;
		this.encoding = Encoding.Default;
		LoadCsvFile();
	}
	
	/// <summary>
	///
	/// </summary>
	/// <param name="fileName">文件名,包括文件路径</param>
	/// <param name="encoding">文件编码</param>
	public CsvStreamReader(string fileName,Encoding encoding)
	{
		this.rowAL = new ArrayList();  
		this.fileName = fileName;
		this.encoding = encoding;
		LoadCsvFile();
	}
	
	/// <summary>
	/// 文件名,包括文件路径
	/// </summary>
	public string FileName
	{
		set
		{
			this.fileName = value;
			LoadCsvFile();
		}
	}
	
	/// <summary>
	/// 文件编码
	/// </summary>
	
	public Encoding FileEncoding
	{
		set
		{
			this.encoding = value;
		}
	}
	
	/// <summary>
	/// 获取行数
	/// </summary>
	public int RowCount
	{
		get
		{
			return this.rowAL.Count;
		}
	}
	
	/// <summary>
	/// 获取列数
	/// </summary>
	public int ColCount
	{
		get
		{
			int maxCol;
			
			maxCol = 0;
			for (int i = 0;i<this.rowAL.Count;i++)
			{
				ArrayList colAL = (ArrayList) this.rowAL[i];    //rowAL中的某个元素依然是ArrayList类型

                maxCol = (maxCol > colAL.Count)?maxCol:colAL.Count;     //取最大值
			}
			
			return maxCol;
		}
	}
	
	
	/// <summary>
	/// 获取某行某列的数据
	
	/// row:行,row = 1代表第一行
	
	/// col:列,col = 1代表第一列  
	/// </summary>
	public string this[int row,int col]
	{
		get
		{   
			//数据有效性验证
			
			CheckRowValid(row);
			CheckColValid(col);
			ArrayList colAL = (ArrayList) this.rowAL[row-1];
			
			//如果请求列数据大于当前行的列时,返回空值
			
			if (colAL.Count < col)
			{
				return "";
			}
			
			return colAL[col-1].ToString();    
		}
	}
	
	
	/// <summary>
	/// 根据最小行,最大行,最小列,最大列,来生成一个DataTable类型的数据
	
	/// 行等于1代表第一行
	
	/// <summary>
	/// 检查行数是否是有效的
	
	/// </summary>
	/// <param name="col"></param>  
	private void CheckRowValid(int row)
	{
		if (row <= 0)
		{
			throw new Exception("行数不能小于0");    
		} 
		if (row > RowCount)
		{
			throw new Exception("没有当前行的数据");   
		}  
	}
	
	/// <summary>
	/// 检查最大行数是否是有效的
	
	/// </summary>
	/// <param name="col"></param>  
	private void CheckMaxRowValid(int maxRow)
	{
		if (maxRow <= 0 && maxRow != -1)
		{
			throw new Exception("行数不能等于0或小于-1");    
		} 
		if (maxRow > RowCount)
		{
			throw new Exception("没有当前行的数据");   
		}  
	}
	
	/// <summary>
	/// 检查列数是否是有效的
	
	/// </summary>
	/// <param name="col"></param>  
	private void CheckColValid(int col)
	{
		if (col <= 0)
		{
			throw new Exception("列数不能小于0");    
		} 
		if (col > ColCount)
		{
			throw new Exception("没有当前列的数据");   
		}
	}
	
	/// <summary>
	/// 检查检查最大列数是否是有效的
	
	/// </summary>
	/// <param name="col"></param>  
	private void CheckMaxColValid(int maxCol)
	{
		if (maxCol <= 0 && maxCol != -1)
		{
			throw new Exception("列数不能等于0或小于-1");    
		} 
		if (maxCol > ColCount)
		{
			throw new Exception("没有当前列的数据");   
		}
	}

	/// <summary>
	/// 载入CSV文件
	/// </summary>
	private void LoadCsvFile()
	{
		//对数据的有效性进行验证
		
		if (this.fileName == null)
		{
			throw new Exception("请指定要载入的CSV文件名");
		}
		else if (!File.Exists(this.fileName))
		{
			throw new Exception("指定的CSV文件不存在");
		}
		else
		{
		}
		if (this.encoding == null)
		{
			this.encoding = Encoding.Default;
		}
		
		StreamReader sr = new StreamReader(this.fileName,this.encoding); 
		string   csvDataLine;
		
		csvDataLine = "";
		while (true)
		{
			string fileDataLine;
			
			fileDataLine = sr.ReadLine();
			if (fileDataLine == null)
			{
				break;
			}
			if (csvDataLine == "")
			{
				csvDataLine = fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
			}
			else
			{
				csvDataLine += "/r/n" + fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
			}
			//如果包含偶数个引号,说明该行数据中出现回车符或包含逗号
			if (!IfOddQuota(csvDataLine))
			{
				AddNewDataLine(csvDataLine);
				csvDataLine = "";
			}
		}
        
		sr.Close();
		//数据行出现奇数个引号
		if (csvDataLine.Length > 0)
		{
			throw new Exception("CSV文件的格式有错误");
		}
	}
	
	/// <summary>
	/// 获取两个连续引号变成单个引号的数据行
	/// </summary>
	/// <param name="fileDataLine">文件数据行</param>
	/// <returns></returns>
	private string GetDeleteQuotaDataLine(string fileDataLine)
	{
		return fileDataLine.Replace("\"\"","\"");
	}
	
	/// <summary>
	/// 判断字符串是否包含奇数个引号
	/// </summary>
	/// <param name="dataLine">数据行</param>
	/// <returns>为奇数时,返回为真;否则返回为假</returns>
	private bool IfOddQuota(string dataLine)
	{
		int  quotaCount;
		bool oddQuota;
		
		quotaCount = 0;
		for (int i = 0;i < dataLine.Length;i++)
		{
			if (dataLine[i] == '\"')
			{
				quotaCount++;
			}
		}
		
		oddQuota = false;
		if (quotaCount % 2 == 1)
		{
			oddQuota = true;
		}   
		
		return oddQuota;
	}
	
	/// <summary>
	/// 判断是否以奇数个引号开始
	
	/// </summary>
	/// <param name="dataCell"></param>
	/// <returns></returns>
	private bool IfOddStartQuota(string dataCell)
	{
		int  quotaCount;
		bool oddQuota;
		
		quotaCount = 0;
		for (int i = 0;i < dataCell.Length;i++)
		{
			if (dataCell[i] == '\"')
			{
				quotaCount++;
			}
			else
			{
				break;
			}
		}
		
		oddQuota = false;
		if (quotaCount % 2 == 1)
		{
			oddQuota = true;
		}   
		
		return oddQuota;
	}
	
	/// <summary>
	/// 判断是否以奇数个引号结尾
	/// </summary>
	/// <param name="dataCell"></param>
	/// <returns></returns>
	private bool IfOddEndQuota(string dataCell)
	{
		int  quotaCount;
		bool oddQuota;
		
		quotaCount = 0;
		for (int i = dataCell.Length -1;i >= 0;i--)
		{
			if (dataCell[i] == '\"')
			{
				quotaCount++;
			}
			else
			{
				break;
			}
		}
		
		oddQuota = false;
		if (quotaCount % 2 == 1)
		{
			oddQuota = true;
		}   
		
		return oddQuota;
	}
	
	/// <summary>
	/// 加入新的数据行
	
	/// </summary>
	/// <param name="newDataLine">新的数据行</param>
	private void AddNewDataLine(string newDataLine)
	{
		Debug.Log("NewLine:" + newDataLine);

        //return;

        ArrayList colAL = new ArrayList();
		string[] dataArray = newDataLine.Split(',');
		bool  oddStartQuota;       //是否以奇数个引号开始
		
		string      cellData;
		
		oddStartQuota = false;
		cellData = "";
		for (int i = 0 ;i < dataArray.Length;i++)
		{
			if (oddStartQuota)
			{
				//因为前面用逗号分割,所以要加上逗号
				cellData += "," + dataArray[i];
				//是否以奇数个引号结尾
				if (IfOddEndQuota(dataArray[i]))
				{
					colAL.Add(GetHandleData(cellData));
					oddStartQuota = false;
					continue;
				}
			}
			else
			{
				//是否以奇数个引号开始
				
				if (IfOddStartQuota(dataArray[i]))
				{
					//是否以奇数个引号结尾,不能是一个双引号,并且不是奇数个引号
					
					if (IfOddEndQuota(dataArray[i]) && dataArray[i].Length > 2 && !IfOddQuota(dataArray[i]))
					{
						colAL.Add(GetHandleData(dataArray[i]));
						oddStartQuota = false;
						continue;
					}
					else
					{
						
						oddStartQuota = true;  
						cellData = dataArray[i];
						continue;
					}
				} 
				else
				{
					colAL.Add(GetHandleData(dataArray[i])); 
				}
			}           
		}

		if (oddStartQuota)
		{
			throw new Exception("数据格式有问题");
		}
		this.rowAL.Add(colAL);
	}
	
	
	/// <summary>
	/// 去掉格子的首尾引号,把双引号变成单引号
	
	/// </summary>
	/// <param name="fileCellData"></param>
	/// <returns></returns>
	private string GetHandleData(string fileCellData)
	{
		if (fileCellData == "")
		{
			return "";
		}
		if (IfOddStartQuota(fileCellData))
		{
			if (IfOddEndQuota(fileCellData))
			{
				return fileCellData.Substring(1,fileCellData.Length-2).Replace("\"\"","\""); //去掉首尾引号,然后把双引号变成单引号
			}
			else
			{
				throw new Exception("数据引号无法匹配" + fileCellData);
			}    
		}
		else
		{
			//考虑形如""    """"      """"""   
			if (fileCellData.Length >2 && fileCellData[0] == '\"')
			{
				fileCellData = fileCellData.Substring(1,fileCellData.Length-2).Replace("\"\"","\""); //去掉首尾引号,然后把双引号变成单引号
			}
		}
		
		return fileCellData;
	}
}

CreatConfigUitl.cs 


using UnityEngine;
using System.IO;
using UnityEditor;

/// <summary>
/// 自动化生成csv文件对应数据类
/// </summary>
public class CreatConfigUitl {
    public static void CreatConfigFile(Object selectObj, string writePath)
    {
        string fileName = selectObj.name;
        string className = fileName;

        if (Directory.Exists(Application.dataPath + writePath) == false)
        {
            Directory.CreateDirectory(Application.dataPath + writePath);
        }

        StreamWriter sw = new StreamWriter(Application.dataPath + writePath + className + ".cs");

        sw.WriteLine("using UnityEngine;\nusing System.Collections;\n");
        sw.WriteLine("public partial class " + className + " : GameConfigDataBase");
        sw.WriteLine("{");

        string filePath = AssetDatabase.GetAssetPath(selectObj);
        CsvStreamReader csr = new CsvStreamReader(filePath);
        for (int colNum = 1; colNum < csr.ColCount + 1; colNum++)
        {
            string fieldName = csr[1, colNum];
            string fieldType = csr[2, colNum];
            sw.WriteLine("\t" + "public " + fieldType + " " + fieldName + ";" + "");
        }
        sw.WriteLine("\t" + "protected override string getFilePath ()");
        sw.WriteLine("\t" + "{");
        //		filePath=filePath.Replace("Assets/Resources/","");
        //		filePath=filePath.Substring(0,filePath.LastIndexOf('.'));
        sw.WriteLine("\t\t" + "return " + "\"" + fileName + "\";");
        sw.WriteLine("\t" + "}");
        sw.WriteLine("}");

        sw.Flush();
        sw.Close();
        AssetDatabase.Refresh();        //这里是一个点
    }
}

 CsvStreamReader.cs  游戏内数据读取解析

using UnityEngine;
using System.Collections;
using System;
using System.Text;
using System.IO;

/// <summary>
/// CSV 读写
/// </summary>
public class CsvStreamReader
{
	private  ArrayList  rowAL;       //行链表,CSV文件的每一行就是一个链
	private  string  fileName;       //文件名
	
	private  Encoding encoding;       //编码
	
	/// <summary>
	///
	/// </summary>
	/// <param name="fileName">文件名,包括文件路径</param>
	public CsvStreamReader(string fileName)
	{
		this.rowAL = new ArrayList();
		this.fileName = fileName;
		this.encoding = Encoding.Default;
		LoadCsvFile();
	}
	
	/// <summary>
	///
	/// </summary>
	/// <param name="fileName">文件名,包括文件路径</param>
	/// <param name="encoding">文件编码</param>
	public CsvStreamReader(string fileName,Encoding encoding)
	{
		this.rowAL = new ArrayList();  
		this.fileName = fileName;
		this.encoding = encoding;
		LoadCsvFile();
	}
	
	/// <summary>
	/// 文件名,包括文件路径
	/// </summary>
	public string FileName
	{
		set
		{
			this.fileName = value;
			LoadCsvFile();
		}
	}
	
	/// <summary>
	/// 文件编码
	/// </summary>
	
	public Encoding FileEncoding
	{
		set
		{
			this.encoding = value;
		}
	}
	
	/// <summary>
	/// 获取行数
	/// </summary>
	public int RowCount
	{
		get
		{
			return this.rowAL.Count;
		}
	}
	
	/// <summary>
	/// 获取列数
	/// </summary>
	public int ColCount
	{
		get
		{
			int maxCol;
			
			maxCol = 0;
			for (int i = 0;i<this.rowAL.Count;i++)
			{
				ArrayList colAL = (ArrayList) this.rowAL[i];    //rowAL中的某个元素依然是ArrayList类型

                maxCol = (maxCol > colAL.Count)?maxCol:colAL.Count;     //取最大值
			}
			
			return maxCol;
		}
	}
	
	
	/// <summary>
	/// 获取某行某列的数据
	
	/// row:行,row = 1代表第一行
	
	/// col:列,col = 1代表第一列  
	/// </summary>
	public string this[int row,int col]
	{
		get
		{   
			//数据有效性验证
			
			CheckRowValid(row);
			CheckColValid(col);
			ArrayList colAL = (ArrayList) this.rowAL[row-1];
			
			//如果请求列数据大于当前行的列时,返回空值
			
			if (colAL.Count < col)
			{
				return "";
			}
			
			return colAL[col-1].ToString();    
		}
	}
	
	
	/// <summary>
	/// 根据最小行,最大行,最小列,最大列,来生成一个DataTable类型的数据
	
	/// 行等于1代表第一行
	
	/// <summary>
	/// 检查行数是否是有效的
	
	/// </summary>
	/// <param name="col"></param>  
	private void CheckRowValid(int row)
	{
		if (row <= 0)
		{
			throw new Exception("行数不能小于0");    
		} 
		if (row > RowCount)
		{
			throw new Exception("没有当前行的数据");   
		}  
	}
	
	/// <summary>
	/// 检查最大行数是否是有效的
	
	/// </summary>
	/// <param name="col"></param>  
	private void CheckMaxRowValid(int maxRow)
	{
		if (maxRow <= 0 && maxRow != -1)
		{
			throw new Exception("行数不能等于0或小于-1");    
		} 
		if (maxRow > RowCount)
		{
			throw new Exception("没有当前行的数据");   
		}  
	}
	
	/// <summary>
	/// 检查列数是否是有效的
	
	/// </summary>
	/// <param name="col"></param>  
	private void CheckColValid(int col)
	{
		if (col <= 0)
		{
			throw new Exception("列数不能小于0");    
		} 
		if (col > ColCount)
		{
			throw new Exception("没有当前列的数据");   
		}
	}
	
	/// <summary>
	/// 检查检查最大列数是否是有效的
	
	/// </summary>
	/// <param name="col"></param>  
	private void CheckMaxColValid(int maxCol)
	{
		if (maxCol <= 0 && maxCol != -1)
		{
			throw new Exception("列数不能等于0或小于-1");    
		} 
		if (maxCol > ColCount)
		{
			throw new Exception("没有当前列的数据");   
		}
	}

	/// <summary>
	/// 载入CSV文件
	/// </summary>
	private void LoadCsvFile()
	{
		//对数据的有效性进行验证
		
		if (this.fileName == null)
		{
			throw new Exception("请指定要载入的CSV文件名");
		}
		else if (!File.Exists(this.fileName))
		{
			throw new Exception("指定的CSV文件不存在");
		}
		else
		{
		}
		if (this.encoding == null)
		{
			this.encoding = Encoding.Default;
		}
		
		StreamReader sr = new StreamReader(this.fileName,this.encoding); 
		string   csvDataLine;
		
		csvDataLine = "";
		while (true)
		{
			string fileDataLine;
			
			fileDataLine = sr.ReadLine();
			if (fileDataLine == null)
			{
				break;
			}
			if (csvDataLine == "")
			{
				csvDataLine = fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
			}
			else
			{
				csvDataLine += "/r/n" + fileDataLine;//GetDeleteQuotaDataLine(fileDataLine);
			}
			//如果包含偶数个引号,说明该行数据中出现回车符或包含逗号
			if (!IfOddQuota(csvDataLine))
			{
				AddNewDataLine(csvDataLine);
				csvDataLine = "";
			}
		}
        
		sr.Close();
		//数据行出现奇数个引号
		if (csvDataLine.Length > 0)
		{
			throw new Exception("CSV文件的格式有错误");
		}
	}
	
	/// <summary>
	/// 获取两个连续引号变成单个引号的数据行
	/// </summary>
	/// <param name="fileDataLine">文件数据行</param>
	/// <returns></returns>
	private string GetDeleteQuotaDataLine(string fileDataLine)
	{
		return fileDataLine.Replace("\"\"","\"");
	}
	
	/// <summary>
	/// 判断字符串是否包含奇数个引号
	/// </summary>
	/// <param name="dataLine">数据行</param>
	/// <returns>为奇数时,返回为真;否则返回为假</returns>
	private bool IfOddQuota(string dataLine)
	{
		int  quotaCount;
		bool oddQuota;
		
		quotaCount = 0;
		for (int i = 0;i < dataLine.Length;i++)
		{
			if (dataLine[i] == '\"')
			{
				quotaCount++;
			}
		}
		
		oddQuota = false;
		if (quotaCount % 2 == 1)
		{
			oddQuota = true;
		}   
		
		return oddQuota;
	}
	
	/// <summary>
	/// 判断是否以奇数个引号开始
	
	/// </summary>
	/// <param name="dataCell"></param>
	/// <returns></returns>
	private bool IfOddStartQuota(string dataCell)
	{
		int  quotaCount;
		bool oddQuota;
		
		quotaCount = 0;
		for (int i = 0;i < dataCell.Length;i++)
		{
			if (dataCell[i] == '\"')
			{
				quotaCount++;
			}
			else
			{
				break;
			}
		}
		
		oddQuota = false;
		if (quotaCount % 2 == 1)
		{
			oddQuota = true;
		}   
		
		return oddQuota;
	}
	
	/// <summary>
	/// 判断是否以奇数个引号结尾
	/// </summary>
	/// <param name="dataCell"></param>
	/// <returns></returns>
	private bool IfOddEndQuota(string dataCell)
	{
		int  quotaCount;
		bool oddQuota;
		
		quotaCount = 0;
		for (int i = dataCell.Length -1;i >= 0;i--)
		{
			if (dataCell[i] == '\"')
			{
				quotaCount++;
			}
			else
			{
				break;
			}
		}
		
		oddQuota = false;
		if (quotaCount % 2 == 1)
		{
			oddQuota = true;
		}   
		
		return oddQuota;
	}
	
	/// <summary>
	/// 加入新的数据行
	
	/// </summary>
	/// <param name="newDataLine">新的数据行</param>
	private void AddNewDataLine(string newDataLine)
	{
		Debug.Log("NewLine:" + newDataLine);

        //return;

        ArrayList colAL = new ArrayList();
		string[] dataArray = newDataLine.Split(',');
		bool  oddStartQuota;       //是否以奇数个引号开始
		
		string      cellData;
		
		oddStartQuota = false;
		cellData = "";
		for (int i = 0 ;i < dataArray.Length;i++)
		{
			if (oddStartQuota)
			{
				//因为前面用逗号分割,所以要加上逗号
				cellData += "," + dataArray[i];
				//是否以奇数个引号结尾
				if (IfOddEndQuota(dataArray[i]))
				{
					colAL.Add(GetHandleData(cellData));
					oddStartQuota = false;
					continue;
				}
			}
			else
			{
				//是否以奇数个引号开始
				
				if (IfOddStartQuota(dataArray[i]))
				{
					//是否以奇数个引号结尾,不能是一个双引号,并且不是奇数个引号
					
					if (IfOddEndQuota(dataArray[i]) && dataArray[i].Length > 2 && !IfOddQuota(dataArray[i]))
					{
						colAL.Add(GetHandleData(dataArray[i]));
						oddStartQuota = false;
						continue;
					}
					else
					{
						
						oddStartQuota = true;  
						cellData = dataArray[i];
						continue;
					}
				} 
				else
				{
					colAL.Add(GetHandleData(dataArray[i])); 
				}
			}           
		}

		if (oddStartQuota)
		{
			throw new Exception("数据格式有问题");
		}
		this.rowAL.Add(colAL);
	}
	
	
	/// <summary>
	/// 去掉格子的首尾引号,把双引号变成单引号
	
	/// </summary>
	/// <param name="fileCellData"></param>
	/// <returns></returns>
	private string GetHandleData(string fileCellData)
	{
		if (fileCellData == "")
		{
			return "";
		}
		if (IfOddStartQuota(fileCellData))
		{
			if (IfOddEndQuota(fileCellData))
			{
				return fileCellData.Substring(1,fileCellData.Length-2).Replace("\"\"","\""); //去掉首尾引号,然后把双引号变成单引号
			}
			else
			{
				throw new Exception("数据引号无法匹配" + fileCellData);
			}    
		}
		else
		{
			//考虑形如""    """"      """"""   
			if (fileCellData.Length >2 && fileCellData[0] == '\"')
			{
				fileCellData = fileCellData.Substring(1,fileCellData.Length-2).Replace("\"\"","\""); //去掉首尾引号,然后把双引号变成单引号
			}
		}
		
		return fileCellData;
	}
}

 GameConfigDataBase.cs   通用数据读取管理模板

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Reflection;

/// <summary>
/// csv 通用数据读取管理模板
/// </summary>
public class GameConfigDataBase
{
		protected virtual string getFilePath ()
		{
				return "";
		}
        //PetConfigData
        static Dictionary<Type,Dictionary<string,GameConfigDataBase>> dataDic = new Dictionary<Type, Dictionary<string, GameConfigDataBase>> ();

        public static T GetConfigData<T> (object key) where T:GameConfigDataBase
		{
				Type setT = typeof(T);
				if (!dataDic.ContainsKey (setT)) {
						ReadConfigData<T> ();
				}
				Dictionary<string,GameConfigDataBase> objDic = dataDic [setT];
                Debug.Log("test  (" + key + ")" + objDic.Count);
				if (!objDic.ContainsKey (key.ToString())) {
						throw new Exception ("no this config");
				}
				return (T)(objDic [key.ToString()]);
		}

		public static List<T> GetConfigDatas<T> () where T:GameConfigDataBase
		{
				List<T> returnList = new List<T> ();
				Type setT = typeof(T);
				if (!dataDic.ContainsKey (setT)) {
						ReadConfigData<T> ();
				}
				Dictionary<string,GameConfigDataBase> objDic = dataDic [setT];
				foreach (KeyValuePair<string,GameConfigDataBase> kvp in objDic) {
						returnList.Add ((T)(kvp.Value));
				}
				return returnList;
		}

		static void ReadConfigData<T> () where T:GameConfigDataBase
		{
				T obj = Activator.CreateInstance<T> ();
				string fileName = obj.getFilePath ();

				string getString = Resources.Load<TextAsset>("GameConfig/" + fileName).text;

                CsvReaderByString csr = new CsvReaderByString (getString);

				Dictionary<string,GameConfigDataBase> objDic = new Dictionary<string, GameConfigDataBase> ();
				
				FieldInfo[] fis = new FieldInfo[csr.ColCount];
				for (int colNum=1; colNum<csr.ColCount+1; colNum++) {
						fis [colNum - 1] = typeof(T).GetField (csr [1, colNum]);
				}

				for (int rowNum=3; rowNum<csr.RowCount+1; rowNum++) {
						T configObj = Activator.CreateInstance<T> ();
						for (int i=0; i<fis.Length; i++) {
								string fieldValue = csr [rowNum, i + 1];
								object setValue = new object ();
								switch (fis [i].FieldType.ToString ()) {
								    case "System.Int32":
										    setValue = int.Parse (fieldValue);
										    break;
								    case "System.Int64":
										    setValue = long.Parse (fieldValue);
										    break;
								    case "System.String":
										    setValue = fieldValue;
										    break;
								    default:
										    Debug.Log ("error data type");
										    break;
								}
								fis [i].SetValue (configObj, setValue);
								if (fis [i].Name == "key" || fis [i].Name == "id") {   
                                        //只检测key和id的值,然后添加到objDic 中
										objDic.Add (setValue.ToString (), configObj);
								}
						}
				}
				dataDic.Add (typeof(T), objDic);    //可以作为参数
		}
}

读取示例

        //数组读取
        var level_configs = LevelConfig.GetConfigDatas<LevelConfig>();

        //单条读取
        var pet = LevelConfig.GetConfigData<LevelConfig>(1);
        var pet2 = LevelConfig.GetConfigData<LevelConfig>("1");

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值