做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资源文件的更多相关文章

  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. iOS.StaticLibrary.1-avoid-duplicate-symbol-in-static-library[draft]

    Avoid duplicate symbol in static library and its customer 发布static library给使用者使用.在实际的工程实践中,iOS静态库一般会 ...

  2. Appium客户端

    Appium版本:1.5.3 Xcode有两个版本:Xcode8.1   Xcode7.2.1 iOS10以下只能用Xcode7.2.1 iOS10及以上可以用Xcode8.1   1.Appium客 ...

  3. 使用servers 启动项目时 ,一直处于启动中, 最后出现无法的问题。

    使用eclipse 中的servers 配置了一个server 来启动项目, 发现无法启动 排除法: 去掉项目配置,单独启动该server ,发现可以启动, 说明是项目出现问题 但是项目并没有报错, ...

  4. VB6.0 读取CSV文件

    最近做了一个Upload文件的需求,文件的格式为CSV,读取文件的方法整理了一下,如下: 1.先写了一个读取CSV文件的Function: '读取CSV文件 '假设传入的参数strFile=C:\Do ...

  5. asp.net 文件批量移动重命名

    最近闲时写了个批量移动重命名文件的工具 点击下载工具

  6. 让谷歌浏览器 chrome 支持小于12px的字体

    webkit的私有属性:{-webkit-text-size-adjust:none;} 但是,在最新版的谷歌里.已经不在支持这个属性啦. 用css3的transform:scale()缩放大小,但是 ...

  7. Windows 7 防火墙对Virtualbox guest的影响

    今天测试ASA的public servers配置,在自己的Win7手提用Virtualbox装了个Linux作为测试服务器,网络设置为bridged.从外网可以ping通测试服务器,也可以连80端口, ...

  8. PowerDesigner增强

    把注释显示出来 选定编辑的表,右键- >Properties- >Columns- >Customize Columns and Filter(或直接用快捷键Ctrl+U)- > ...

  9. 完全背包问题:湫湫系列故事――减肥记I(HDU 4508)

    湫湫系列故事――减肥记I  HDU 4508 一道裸的完全背包 #include<iostream> #include<algorithm> #include<stdio ...

  10. h5专题常用小代码

    今天把做专题常用的js代码总结出来(持续更新),方便以后直接复制使用,不用老敲啊敲 1.屏幕适配JS代码 <script> var phoneScale = parseInt(window ...