做unity 项目也有一段时间了,从unity项目开发和学习中也遇到了很多坑,并且也从中学习到了很多曾经未接触的领域。项目中的很多功能模块,从今天开始把自己的思路和代码奉上给学渣们作为一份学习的资料。如果学长们看到哪里写的不好欢迎吐槽并给予更好的解决方案。好了话也不多说了今天给大家亮出的是excel 数据解析和在unity项目中的应用。

*导入excel,解析xml,生成c#数据表,生成asset数据文件
 *原理 在导入xml文件的时候通过XmlReader读取xml文件
 *把需要的内容按照读取的顺序保存,然后在生成key,最后生成key,value格式,然后自己手动定义要保存的内容数据格式最后通过自定义的数据格式生成数据文件

  1. 注:ExcelControl 这个类必须放在Editor目录下
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. using System.Xml;
  5. using System;
  6. using System.Collections.Generic;
  7.  
  8. public class ExcelControl : AssetPostprocessor
  9. {
  10. static string FILE_PATH = "Assets\\Data\\";
  11.  
  12. /** 在导入所有资源之后 */
  13. static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
  14. {
  15.  
  16. string excelPath = "";
  17. for (int i = ; i < importedAssets.Length; i++)
  18. {
  19. /** 拦截Assets/Excel目录下面所有.xml文件进行解析 */
  20. excelPath = importedAssets[i];
  21. if (excelPath.Contains(".xml"))
  22. {
  23. ReadXml(excelPath);
  24. Debug.Log("Excel import asset path : " + excelPath);
  25. }
  26. }
  27. }
  28.  
  29. static void ReadXml(string xmlPath)
  30. {
  31. /** 读取xml 文件 */
  32. XmlReader xReader = null;
  33. try
  34. {
  35. xReader = XmlReader.Create(xmlPath);
  36. }
  37. catch (Exception e)
  38. {
  39. Debug.LogError("Read Excel Error! Path = " + xmlPath);
  40. }
  41. if (xReader == null)
  42. {
  43. return;
  44. }
  45.  
  46. /** 保存所有数据到表中 */
  47. List<xmlSheetList> xmlDataList = new List<xmlSheetList>();
  48. xmlSheetList xsl = null;
  49.  
  50. /** 记录每个节点的开始 */
  51. bool sheetBegin = false;
  52. bool rowBegin = false;
  53. bool cellBegin = false;
  54. bool dataBegin = false;
  55.  
  56. /** 行数 */
  57. int rowNum = ;
  58. /** 列数 */
  59. int cellNum = ;
  60. /** 计数器 */
  61. int num = ;
  62. while (xReader.Read())
  63. {
  64. string name = xReader.Name;
  65.  
  66. if (name == "Worksheet")
  67. {
  68. /** 开始 */
  69. if (xReader.NodeType == XmlNodeType.Element)
  70. {
  71. sheetBegin = true;
  72. /** xmlSheet */
  73. xsl = new xmlSheetList();
  74. xsl.Clear();
  75. }
  76. /** 结束 */
  77. else if (xReader.NodeType == XmlNodeType.EndElement)
  78. {
  79. sheetBegin = false;
  80. xmlDataList.Add(xsl);
  81. }
  82. }
  83. else if (name == "Row")
  84. {
  85. /** 开始 */
  86. if (xReader.NodeType == XmlNodeType.Element)
  87. {
  88. rowBegin = true;
  89. rowNum++;
  90. }
  91. /** 结束 */
  92. else if (xReader.NodeType == XmlNodeType.EndElement)
  93. {
  94. rowBegin = false;
  95. }
  96. }
  97. else if (name == "Cell")
  98. {
  99. /** 开始 */
  100. if (xReader.NodeType == XmlNodeType.Element)
  101. {
  102. cellBegin = true;
  103. if (rowNum == )
  104. {
  105. cellNum++;
  106. }
  107. if (!string.IsNullOrEmpty(xReader.GetAttribute("ss:Index")))
  108. {
  109.  
  110. Debug.LogError(string.Format("xml read error! may be empty! : {0} Row = {1} Cell = {2}.", xmlPath, (int)(num / cellNum), ((num % cellNum) + )));
  111. return;
  112. }
  113. }
  114. /** 结束 */
  115. else if (xReader.NodeType == XmlNodeType.EndElement)
  116. {
  117. cellBegin = false;
  118. }
  119. }
  120. else if (name == "Data")
  121. {
  122. /** 开始 */
  123. if (xReader.NodeType == XmlNodeType.Element)
  124. {
  125. dataBegin = true;
  126. }
  127. /** 结束 */
  128. else if (xReader.NodeType == XmlNodeType.EndElement)
  129. {
  130. dataBegin = false;
  131. }
  132. }
  133. else {
  134. /** 过滤数据 */
  135. if (sheetBegin && rowBegin && cellBegin && dataBegin)
  136. {
  137. num++;
  138. if (xsl != null)
  139. {
  140. xsl.Add(xReader.Value);
  141. }
  142. }
  143. }
  144. }
  145. int an = xmlDataList.Count;
  146.  
  147. //生成key列表
  148. List<string> keys = new List<string>();
  149. for (int i = ; i < xmlDataList.Count; i++)
  150. {
  151. for (int k = ; k < cellNum; k++)
  152. {
  153. if (k < cellNum)
  154. {
  155. keys.Add(xmlDataList[i].sheetList[]);
  156. // 删除原始列表中key的数据
  157. xmlDataList[i].sheetList.RemoveAt();
  158. }
  159. else {
  160. break;
  161. }
  162. }
  163. }
  164.  
  165. // 创建key 和 value 结构
  166. List<Row> rowList = new List<Row>();
  167. int nb = ;
  168. for (int k = ; k < xmlDataList.Count; k++)
  169. {
  170. nb = xmlDataList[k].sheetList.Count / cellNum;
  171. for (int i = ; i < nb; i++)
  172. {
  173. Row row = new Row();
  174. row._key = keys;
  175. for (int j = ; j < cellNum; j++)
  176. {
  177. row._cells.Add(xmlDataList[k].sheetList[]);
  178. xmlDataList[k].sheetList.RemoveAt();
  179. }
  180. rowList.Add(row);
  181. }
  182. }
  183. /** 创建资源 */
  184. CreatXmlListAsset(rowList, xmlPath);
  185. }
  186.  
  187. /** 生成数据文件 */
  188. static void CreatXmlListAsset(List<Row> rl, string xmlPath)
  189. {
  190. if (xmlPath.Contains("excel.xml"))
  191. {
  192. //新生成的数据
  193. ExcelDataList dataList = null;
  194.  
  195. //检查是否已经声称过了数据表
  196. UnityEngine.Object oldFile = AssetDatabase.LoadAssetAtPath(xmlPath, typeof(ExcelDataList));
  197. bool newFile = false;
  198. if (oldFile)
  199. {
  200. dataList = oldFile as ExcelDataList;
  201. }
  202. else {
  203. dataList = new ExcelDataList();
  204. newFile = true;
  205. }
  206. //清空已有数据
  207. dataList.Datalist.Clear();
  208.  
  209. //生成数据
  210. for (int i = ; i < rl.Count; i++)
  211. {
  212. ExcelData newData = new ExcelData();
  213. Row data = rl[i];
  214. newData.id = GetInt(data["ID"]);
  215. newData.name = data["Name"];
  216. dataList.Datalist.Add(newData);
  217. }
  218.  
  219. // 创建数据文件
  220. if (newFile)
  221. {
  222. AssetDatabase.CreateAsset(dataList, FILE_PATH + "ExcelDataList.asset");
  223. }
  224. else {
  225. EditorUtility.SetDirty(dataList);
  226. }
  227. }
  228. }
  229.  
  230. static int GetInt(string data)
  231. {
  232. float val = ;
  233. try
  234. {
  235. val = float.Parse(data);
  236. }
  237. catch (Exception e)
  238. {
  239. Debug.LogError(e.Message + " data[" + data + "]");
  240. }
  241. return Mathf.RoundToInt(val);
  242. }
  243.  
  244. static float GetFloat(string data)
  245. {
  246. float val = ;
  247. try
  248. {
  249. val = float.Parse(data);
  250. }
  251. catch (Exception e)
  252. {
  253. Debug.LogError(e.Message + " data[" + data + "]");
  254. }
  255. return val;
  256. }
  257.  
  258. static bool GetBool(string data)
  259. {
  260. int val = ;
  261. try
  262. {
  263. val = int.Parse(data);
  264. }
  265. catch (Exception e)
  266. {
  267. Debug.LogError(e.Message + " data[" + data + "]");
  268. }
  269. return val == ? false : true;
  270. }
  271. }
  272.  
  273. /** xmlsheel所有字符串数据 */
  274. public class xmlSheetList
  275. {
  276. public List<string> sheetList = new List<string>();
  277.  
  278. public void Add(string str)
  279. {
  280. sheetList.Add(str);
  281. }
  282.  
  283. public void Clear()
  284. {
  285. sheetList.Clear();
  286. }
  287. }
  288.  
  289. /** xml (key, Value) Cell */
  290. public class Row
  291. {
  292. public List<string> _cells = new List<string>();
  293. public List<string> _key = new List<string>();
  294.  
  295. public string this[string key]
  296. {
  297. get
  298. {
  299. string val = "";
  300. int pos = _key.IndexOf(key);
  301. if (pos < || pos >= _cells.Count)
  302. {
  303. Debug.LogError("can't find the value of the key:[" + key + "]");
  304. }
  305. else {
  306. val = _cells[pos];
  307. }
  308. return val;
  309. }
  310. }
  311. }
  1.  
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. [System.Serializable]
  6. public class ExcelData {
  7. public string name = "";
  8. public int id = ;
  9. }
  10. public class ExcelDataList : ScriptableObject {
  11. public List<ExcelData> Datalist = new List<ExcelData>();
  12. }
  1. ExcelData 自定义的数据格式根据项目需求
  2.  
  3. 支持原创,转载请注明作者出处我的博客http://home.cnblogs.com/u/fastHro/

unity 读取excel表 生成asset资源文件的更多相关文章

  1. Unity读取Excel文件(附源代码)

    今天想弄个Unity读取Excel的功能的,发现网上有许多方法,采用其中一种方法:加入库文件 Excel.dll 和ICSharpCode.SharpZipLib.dll库文件,(还有System.D ...

  2. Jmeter读取excel表中用例数据实现接口压测

    传统的接口测试,都是在接口中手动输入不同用例准备的多种场景参数数据,一遍一遍的输入来执行多个不同的用例,但是现在利用excel表格准备各种类型的数据,使用Jmeter中Jmeter CSV Data ...

  3. Python xlrd模块读取Excel表中的数据

    1.xlrd库的安装 直接使用pip工具进行安装(当然也可以使用pycharmIDE进行安装,这里就不详述了) pip install xlrd 2.xlrd模块的一些常用命令 ①打开excel文件并 ...

  4. Python+Selenium进行UI自动化测试项目中,常用的小技巧1:读取excel表,转化成字典(dict)输出

    从今天开始我将会把在项目中遇到的问题,以及常用的一些技巧来分享出来,以此来促进自己的学习和提升自己:更加方便我以后的查阅. 现在要说的是:用Python来读取excel表的数据,返回字典(dict), ...

  5. Jar中的Java程序如何读取Jar包中的资源文件

    Jar中的Java程序如何读取Jar包中的资源文件 比如项目的组织结构如下(以idea中的项目为例): |-ProjectName |-.idea/  //这个目录是idea中项目的属性文件夹 |-s ...

  6. 读取web应用下的资源文件(例如properties)

    package gz.itcast.b_resource; import java.io.IOException; import java.io.InputStream; import java.ut ...

  7. Aspose.cells 读取Excel表中的图片问题

    一.说明 本文主要是讲解,怎么使用aspose.cells读取Excel表中的图片,并把图片转换成流或是image对象. 二.开发环境说明 开发工具vs2012,c#语言, 三.Aspose.cell ...

  8. SVG-Android开源库——SVG生成Vector资源文件的编辑预览工具

    Vector矢量图在Android项目中的应用越来越广泛,但是如果你想用Android Studio自带的工具将SVG图片转化成Vector资源文件却是相当麻烦,首先能支持的SVG规范较少,其次操作流 ...

  9. 读取web工程中.properties资源文件的模板代码

    读取web工程中.properties资源文件的模板代码 // 读取web工程中.properties资源文件的模板代码 private void test2() throws IOException ...

随机推荐

  1. ORA-01439: column to be modified must be empty to change datatype

    修改数据库字段类型,但是由于数据表已经存在数据,无法修改: 显示错误:  写道 ORA-01439: column to be modified must be empty to change dat ...

  2. POSIX信号处理

    信号用于通知进程发生了某件事情,可以由一个进程发给另一个进程,也可以由内核发个一个进程. 每个信号都有一个关联的行为,可以通过sigaction函数来设置一个信号的行为,有3种选择: 1.定义一个信号 ...

  3. 更改Windows系统时间同步频率【windows 7,windows 8,win10】

    Windows系统默认的时间同步间隔是7天,如果我们需要修改同步的时间间隔(同步频率),我们可以通过修改注册表来手动修改它的自动同步间隔以提高同步次数,保证时钟的精度,windows7,Windows ...

  4. AjaxControlToolkit MaskedEdit Unspecified error 未指定错误

    使用AjaxControlToolkit 里面的 MaskedEditValidator控件,IE里面在如下的js中出现未指定(Unspecified error)错误, if (document.a ...

  5. Ubuntu遇到Please ensure that adb is correctly located at '...adb.exe' and can be executed 问题解决方法

    上次我们在SDK更新的到最新的Android L版本之后,我发现我的ADT和android指定的版本不对应,我的ADT是22版本的,android L需要23版本以上的,版本不对应的话就无法加载这个S ...

  6. 统计学习方法笔记(KNN)

    k近邻法(k-nearest neighbor,k-NN) 输入:实例的特征向量,对应于特征空间的点:输出:实例的类别,可以取多类. 分类时,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预 ...

  7. 数据库管理员<三>

    数据库管理员  介绍 每个 oracle 数据库应该至少有一个数据库管理员(dba),对于一个小的数据库,一个 dba 就够了,但是对于一个大的数据库 可能需要多个 dba 分担不同的管理职责.那么 ...

  8. [Shell]字符截取命令:cut, printf, awk, sed

    ------------------------------------------------------------------------------------------- [cut命令] ...

  9. 关于卡尔曼滤波(Kalman Filter)的很好讲解

    http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies C#代码: double[] Data = new double[] { 0.39 ...

  10. 传值 属性 block 单例 协议

    界面传值 四种传值的方式 1.属性传值(从前往后) 步骤: 1.属性传值用于第一个界面向第二个界面传值 2.明确二者联系的桥梁,也就是触发跳转的地方 3.明确传输的值,类型是什么 4.在第二个视图控制 ...