参考链接:
http://www.xuanyusong.com/archives/2429
http://blog.csdn.net/asd237241291/article/details/11788831
http://www.manew.com/thread-44458-1-1.html
excel转json:
http://pan.baidu.com/s/1gdvzsQZ
使用:
1.导入“ExcelToJson.unitypackage”工具包
2.把所有Excel表文件转成.csv文件。
3.然后把所有.csv文件copy到工程的Assets\Data文件夹目录
4.点击"Game->ExcelToJson"
5.然后默认会在“Assets\Json\Data”目录下生成所有Excel表文件对应的Json格式的数据。
解析excel:
一般 Excel的格式分为两种,一种是 .xls 还有一种是.xlsx ,这里我们只说.xlsx 。
需要使用第三方开发包:ICSharpCode.SharpZipLib,下载地址:http://yun.baidu.com/s/1pJ61ZUN
using UnityEngine; using System.IO; using Excel; using System.Data; //要引用System.Data.dll //只能读取XLSX,且读取时XLSX文件要关闭 //在表格删除内容时,不能按del键,因为这样会使字符串变为空字符串,能读取到DataSet中, //正确的删除方法是右键/删除 public class ReadXLSX { public static string[,] Read(string path, string sheetName) { FileStream stream = File.Open(path, FileMode.Open, FileAccess.Read); IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); DataSet dataSet = excelReader.AsDataSet(); int rows = dataSet.Tables[sheetName].Rows.Count; int columns = dataSet.Tables[sheetName].Columns.Count; string[,] result = new string[rows,columns]; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { result[i,j] = dataSet.Tables[sheetName].Rows[i][j].ToString(); Debug.Log(result[i, j]); } } stream.Close(); stream.Dispose(); excelReader.Close(); excelReader.Dispose(); return result; } }
这里我有一个AnimClip.xlsx文件,文件中有两个sheet,一个叫all,用来记录需要切割的模型的名字,一个是rrobot,用来记录模型rrobot的动画切割信息
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; public static class AnimationClipConfig { public static bool isInit = false; public static List<Model> modelList = new List<Model>(); public static void Init() { if (isInit) return; isInit = true; string[,] names = ReadXLSX.Read(Application.dataPath + @"\AnimClip.xlsx", "all"); for (int i = 1; i < names.GetLength(0); i++) { string[,] clips = ReadXLSX.Read(Application.dataPath + @"\AnimClip.xlsx", names[i, 0]); Model model = new Model(names[i, 0]); for (int j = 1; j < clips.GetLength(0); j++) { string clipName = clips[j, 0]; int clipFirstFrame = Convert.ToInt32(clips[j, 1]); int clipLastFrame = Convert.ToInt32(clips[j, 2]); bool clipIsLoop = Convert.ToBoolean(clips[j, 3]); model.animClips.Add(new AnimClip(clipName, clipFirstFrame, clipLastFrame, clipIsLoop)); } modelList.Add(model); } } #region public class AnimClip { public string name; public int firstFrame; public int lastFrame; public bool isloop; public AnimClip(string name, int firstFrame, int lastFrame, bool isloop) { this.name = name; this.firstFrame = firstFrame; this.lastFrame = lastFrame; this.isloop = isloop; } } public class Model { public string name; public List<AnimClip> animClips = new List<AnimClip>(); public Model(string name) { this.name = name; } } #endregion }
using UnityEditor; using UnityEngine; public class FBXAnimationsCut : AssetPostprocessor { public void OnPreprocessModel() { //当前正在导入的模型 ModelImporter modelImporter = (ModelImporter) assetImporter; AnimationClipConfig.Init(); foreach (AnimationClipConfig.Model item in AnimationClipConfig.modelList) { //当前导入模型的路径包含我们动画数据表中的模型名字,那就要对这个模型的动画进行切割 if (assetPath.Contains(item.name)) { modelImporter.animationType = ModelImporterAnimationType.Legacy; modelImporter.generateAnimations = ModelImporterGenerateAnimations.GenerateAnimations; //modelImporter.splitAnimations = true; ModelImporterClipAnimation[] animations = new ModelImporterClipAnimation[item.animClips.Count]; for (int i = 0; i < item.animClips.Count; i++) { animations[i] = SetClipAnimation(item.animClips[i].name, item.animClips[i].firstFrame, item.animClips[i].lastFrame, item.animClips[i].isloop); } modelImporter.clipAnimations = animations; } } } ModelImporterClipAnimation SetClipAnimation(string name, int first, int last, bool isLoop) { ModelImporterClipAnimation tempClip = new ModelImporterClipAnimation(); tempClip.name = name; tempClip.firstFrame = first; tempClip.lastFrame = last; tempClip.loop = isLoop; if (isLoop) tempClip.wrapMode = WrapMode.Loop; else tempClip.wrapMode = WrapMode.Default; return tempClip; } }