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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gamebox1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值