unity 读取excel表 生成asset资源文件
做unity 项目也有一段时间了,从unity项目开发和学习中也遇到了很多坑,并且也从中学习到了很多曾经未接触的领域。项目中的很多功能模块,从今天开始把自己的思路和代码奉上给学渣们作为一份学习的资料。如果学长们看到哪里写的不好欢迎吐槽并给予更好的解决方案。好了话也不多说了今天给大家亮出的是excel 数据解析和在unity项目中的应用。
*导入excel,解析xml,生成c#数据表,生成asset数据文件
*原理 在导入xml文件的时候通过XmlReader读取xml文件
*把需要的内容按照读取的顺序保存,然后在生成key,最后生成key,value格式,然后自己手动定义要保存的内容数据格式最后通过自定义的数据格式生成数据文件
注:ExcelControl 这个类必须放在Editor目录下
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Xml;
using System;
using System.Collections.Generic; public class ExcelControl : AssetPostprocessor
{
static string FILE_PATH = "Assets\\Data\\"; /** 在导入所有资源之后 */
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{ string excelPath = "";
for (int i = ; i < importedAssets.Length; i++)
{
/** 拦截Assets/Excel目录下面所有.xml文件进行解析 */
excelPath = importedAssets[i];
if (excelPath.Contains(".xml"))
{
ReadXml(excelPath);
Debug.Log("Excel import asset path : " + excelPath);
}
}
} static void ReadXml(string xmlPath)
{
/** 读取xml 文件 */
XmlReader xReader = null;
try
{
xReader = XmlReader.Create(xmlPath);
}
catch (Exception e)
{
Debug.LogError("Read Excel Error! Path = " + xmlPath);
}
if (xReader == null)
{
return;
} /** 保存所有数据到表中 */
List<xmlSheetList> xmlDataList = new List<xmlSheetList>();
xmlSheetList xsl = null; /** 记录每个节点的开始 */
bool sheetBegin = false;
bool rowBegin = false;
bool cellBegin = false;
bool dataBegin = false; /** 行数 */
int rowNum = ;
/** 列数 */
int cellNum = ;
/** 计数器 */
int num = ;
while (xReader.Read())
{
string name = xReader.Name; if (name == "Worksheet")
{
/** 开始 */
if (xReader.NodeType == XmlNodeType.Element)
{
sheetBegin = true;
/** xmlSheet */
xsl = new xmlSheetList();
xsl.Clear();
}
/** 结束 */
else if (xReader.NodeType == XmlNodeType.EndElement)
{
sheetBegin = false;
xmlDataList.Add(xsl);
}
}
else if (name == "Row")
{
/** 开始 */
if (xReader.NodeType == XmlNodeType.Element)
{
rowBegin = true;
rowNum++;
}
/** 结束 */
else if (xReader.NodeType == XmlNodeType.EndElement)
{
rowBegin = false;
}
}
else if (name == "Cell")
{
/** 开始 */
if (xReader.NodeType == XmlNodeType.Element)
{
cellBegin = true;
if (rowNum == )
{
cellNum++;
}
if (!string.IsNullOrEmpty(xReader.GetAttribute("ss:Index")))
{ Debug.LogError(string.Format("xml read error! may be empty! : {0} Row = {1} Cell = {2}.", xmlPath, (int)(num / cellNum), ((num % cellNum) + )));
return;
}
}
/** 结束 */
else if (xReader.NodeType == XmlNodeType.EndElement)
{
cellBegin = false;
}
}
else if (name == "Data")
{
/** 开始 */
if (xReader.NodeType == XmlNodeType.Element)
{
dataBegin = true;
}
/** 结束 */
else if (xReader.NodeType == XmlNodeType.EndElement)
{
dataBegin = false;
}
}
else {
/** 过滤数据 */
if (sheetBegin && rowBegin && cellBegin && dataBegin)
{
num++;
if (xsl != null)
{
xsl.Add(xReader.Value);
}
}
}
}
int an = xmlDataList.Count; //生成key列表
List<string> keys = new List<string>();
for (int i = ; i < xmlDataList.Count; i++)
{
for (int k = ; k < cellNum; k++)
{
if (k < cellNum)
{
keys.Add(xmlDataList[i].sheetList[]);
// 删除原始列表中key的数据
xmlDataList[i].sheetList.RemoveAt();
}
else {
break;
}
}
} // 创建key 和 value 结构
List<Row> rowList = new List<Row>();
int nb = ;
for (int k = ; k < xmlDataList.Count; k++)
{
nb = xmlDataList[k].sheetList.Count / cellNum;
for (int i = ; i < nb; i++)
{
Row row = new Row();
row._key = keys;
for (int j = ; j < cellNum; j++)
{
row._cells.Add(xmlDataList[k].sheetList[]);
xmlDataList[k].sheetList.RemoveAt();
}
rowList.Add(row);
}
}
/** 创建资源 */
CreatXmlListAsset(rowList, xmlPath);
} /** 生成数据文件 */
static void CreatXmlListAsset(List<Row> rl, string xmlPath)
{
if (xmlPath.Contains("excel.xml"))
{
//新生成的数据
ExcelDataList dataList = null; //检查是否已经声称过了数据表
UnityEngine.Object oldFile = AssetDatabase.LoadAssetAtPath(xmlPath, typeof(ExcelDataList));
bool newFile = false;
if (oldFile)
{
dataList = oldFile as ExcelDataList;
}
else {
dataList = new ExcelDataList();
newFile = true;
}
//清空已有数据
dataList.Datalist.Clear(); //生成数据
for (int i = ; i < rl.Count; i++)
{
ExcelData newData = new ExcelData();
Row data = rl[i];
newData.id = GetInt(data["ID"]);
newData.name = data["Name"];
dataList.Datalist.Add(newData);
} // 创建数据文件
if (newFile)
{
AssetDatabase.CreateAsset(dataList, FILE_PATH + "ExcelDataList.asset");
}
else {
EditorUtility.SetDirty(dataList);
}
}
} static int GetInt(string data)
{
float val = ;
try
{
val = float.Parse(data);
}
catch (Exception e)
{
Debug.LogError(e.Message + " data[" + data + "]");
}
return Mathf.RoundToInt(val);
} static float GetFloat(string data)
{
float val = ;
try
{
val = float.Parse(data);
}
catch (Exception e)
{
Debug.LogError(e.Message + " data[" + data + "]");
}
return val;
} static bool GetBool(string data)
{
int val = ;
try
{
val = int.Parse(data);
}
catch (Exception e)
{
Debug.LogError(e.Message + " data[" + data + "]");
}
return val == ? false : true;
}
} /** xmlsheel所有字符串数据 */
public class xmlSheetList
{
public List<string> sheetList = new List<string>(); public void Add(string str)
{
sheetList.Add(str);
} public void Clear()
{
sheetList.Clear();
}
} /** xml (key, Value) Cell */
public class Row
{
public List<string> _cells = new List<string>();
public List<string> _key = new List<string>(); public string this[string key]
{
get
{
string val = "";
int pos = _key.IndexOf(key);
if (pos < || pos >= _cells.Count)
{
Debug.LogError("can't find the value of the key:[" + key + "]");
}
else {
val = _cells[pos];
}
return val;
}
}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic; [System.Serializable]
public class ExcelData {
public string name = "";
public int id = ;
}
public class ExcelDataList : ScriptableObject {
public List<ExcelData> Datalist = new List<ExcelData>();
}
ExcelData 自定义的数据格式根据项目需求 支持原创,转载请注明作者出处我的博客http://home.cnblogs.com/u/fastHro/
unity 读取excel表 生成asset资源文件的更多相关文章
- Unity读取Excel文件(附源代码)
今天想弄个Unity读取Excel的功能的,发现网上有许多方法,采用其中一种方法:加入库文件 Excel.dll 和ICSharpCode.SharpZipLib.dll库文件,(还有System.D ...
- Jmeter读取excel表中用例数据实现接口压测
传统的接口测试,都是在接口中手动输入不同用例准备的多种场景参数数据,一遍一遍的输入来执行多个不同的用例,但是现在利用excel表格准备各种类型的数据,使用Jmeter中Jmeter CSV Data ...
- Python xlrd模块读取Excel表中的数据
1.xlrd库的安装 直接使用pip工具进行安装(当然也可以使用pycharmIDE进行安装,这里就不详述了) pip install xlrd 2.xlrd模块的一些常用命令 ①打开excel文件并 ...
- Python+Selenium进行UI自动化测试项目中,常用的小技巧1:读取excel表,转化成字典(dict)输出
从今天开始我将会把在项目中遇到的问题,以及常用的一些技巧来分享出来,以此来促进自己的学习和提升自己:更加方便我以后的查阅. 现在要说的是:用Python来读取excel表的数据,返回字典(dict), ...
- Jar中的Java程序如何读取Jar包中的资源文件
Jar中的Java程序如何读取Jar包中的资源文件 比如项目的组织结构如下(以idea中的项目为例): |-ProjectName |-.idea/ //这个目录是idea中项目的属性文件夹 |-s ...
- 读取web应用下的资源文件(例如properties)
package gz.itcast.b_resource; import java.io.IOException; import java.io.InputStream; import java.ut ...
- Aspose.cells 读取Excel表中的图片问题
一.说明 本文主要是讲解,怎么使用aspose.cells读取Excel表中的图片,并把图片转换成流或是image对象. 二.开发环境说明 开发工具vs2012,c#语言, 三.Aspose.cell ...
- SVG-Android开源库——SVG生成Vector资源文件的编辑预览工具
Vector矢量图在Android项目中的应用越来越广泛,但是如果你想用Android Studio自带的工具将SVG图片转化成Vector资源文件却是相当麻烦,首先能支持的SVG规范较少,其次操作流 ...
- 读取web工程中.properties资源文件的模板代码
读取web工程中.properties资源文件的模板代码 // 读取web工程中.properties资源文件的模板代码 private void test2() throws IOException ...
随机推荐
- memcache与memcached介绍及安装配置
也许大家一看到Memcache和Memcached会有点晕,这两者有什么关系又有什么区别呢,下面先给大家说下Memcached,Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应 ...
- 第六章 springboot + 事务
在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. mybatis与spring集成后,其事务该怎么做?其实很简单,直接在上一节代码的基础上在相应的方法(通常是servic ...
- XE3随笔3:访问
测试数据提前加入 Memo1 中: { "name": "张三", /* 注释 */ "age": 33, "sex": ...
- PHP查看当前端口号
<?php echo "当前页面服务器IP地址为:"; echo $_SERVER["SERVER_ADDR"]; echo "<br / ...
- maven 配置篇 之pom
maven 配置篇 之pom.xml(一) 博客分类: pm mavenXML配置管理项目管理junit 说完了settings.xml配置,下来说一下maven2的主要配置pom.xml ...
- 反射中通过class标记来获取字段及方法
//这是通过class标记获取字段的代码 Field[] fields= classzz.getDeclaredFields(); //获取该class标记的表名代码,必须为,getSimpleNam ...
- 【洛谷P1941】飞扬的小鸟
f [ i ] [ j ] 表示横坐标为 i ,高度为 j 时的最小点击次数 分别dp处理: 1.上升,(1)<m (2)>=m 2.下降 3.管道 #include<cstdio& ...
- 斯坦福第五课:Octave 教程(Octave Tutorial)
5.1 基本操作 5.2 移动数据 5.3 计算数据 5.4 绘图数据 5.5 控制语句:for,while,if 语句 5.6 矢量化 5.7 工作和提交的编程练习 5.1 基本操作
- C++ 多重集的使用
C++ 多重集的使用 多重集当中的数据映射关系将不是前面的一对一的关系,而是一对多,也就是可以在容器当中插入具有相同key的实例.关于组织方式,LZ进行了下面的大胆的预测. 第一.底层的数据组织方式如 ...
- React Native填坑之旅--Button篇
从React过来,发现React Native(以下简称RN)居然没有Button.隔壁的iOS是有UIButton的,隔壁的隔壁的Android里也是有的.没有Button,就没有点击效果啊.这还真 ...