[Unity基础]解析excel以及动画切割

来源:互联网 发布:英雄美工铱金钢笔9018 编辑:程序博客网 时间:2024/06/07 06:00

参考链接:

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;    }}  

0 0
原创粉丝点击