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;
}
}
unity模型动画分离器
最新推荐文章于 2022-03-10 11:00:05 发布