读书人

unity模型卡通分离器

发布时间: 2012-06-26 10:04:13 作者: rapoo

unity模型动画分离器

using UnityEngine;using UnityEditor;using System.Collections;using System.Collections.Generic;using System.IO;/**根据时间表分离骨骼动画.时间表名字与模型一致.但后缀是txt.模型须以@开头.如 @Model.fbx,时间表如:@Model.txt.时间表内容,以 //开头的行不处理. 以 空格 分隔.动画名 开始帧 结束帧*/public class SplitAnimsProcessor : AssetPostprocessor{    static readonly string STR_TIME_FILE_NOT_EXIST = "时间文件不存在.";    static readonly string STR_SUCC_SPLIT_ANIMATION = "成功分离动画:";    //时间文件的后缀.    public const string EXTENSION_NAME = ".txt";    //每行的分割符号    public const char SPLIT_SYMBOL = ' ';    public void OnPreprocessModel()    {        if (assetPath.Contains("@"))        {            //读取 动画时间文件,并分离动画            SplitAnims(ReadTimeConfig());        }    }    /// <summary>    /// 读取 时间配置文件.    /// </summary>    /// <returns></returns>    private List<string> ReadTimeConfig()    {        string dirPath = Directory.GetParent(assetPath).ToString();        string fileName = Path.GetFileNameWithoutExtension(assetPath);        string path = dirPath + "/" + fileName + EXTENSION_NAME;        List<string> lines = new List<string>();        if (File.Exists(path))        {            FileStream fs = new FileStream(path, FileMode.Open);            StreamReader sr = new StreamReader(fs);            while (!sr.EndOfStream)            {                string line = sr.ReadLine();                if (!string.IsNullOrEmpty(line) && !line.StartsWith("//"))                    lines.Add(line);            }            sr.Close();            fs.Close();            return lines;        }        return null;    }    /// <summary>    /// 分离动画    /// </summary>    /// <param name="lines"></param>    private void SplitAnims(List<string> lines)    {        string result = STR_TIME_FILE_NOT_EXIST;        if (lines != null)        {            ModelImporter importer = (ModelImporter)assetImporter;            List<ModelImporterClipAnimation> clips = new List<ModelImporterClipAnimation>();            foreach (string line in lines)            {                string[] timeLine = line.Split(SPLIT_SYMBOL);                string name = timeLine[0];                int start = int.Parse(timeLine[1]);                int end = int.Parse(timeLine[2]);                //----------                clips.Add(GenAnim(name, start, end));            }            importer.clipAnimations = clips.ToArray();            result = STR_SUCC_SPLIT_ANIMATION + clips.Count;        }        Debug.Log(result);    }    /// <summary>    /// 创建 动画剪辑.    /// </summary>    /// <param name="name"></param>    /// <param name="startFrame"></param>    /// <param name="endFrame"></param>    /// <returns></returns>    private ModelImporterClipAnimation GenAnim(string name, int startFrame, int endFrame)    {        ModelImporterClipAnimation clip = new ModelImporterClipAnimation();        clip.firstFrame = startFrame;        clip.lastFrame = endFrame;        clip.name = name;        return clip;    }}

读书人网 >移动开发

热点推荐