制作unity小工具 获取FBX模型里面的AnimationClip片段

来源:互联网 发布:燕十八php教程2016 编辑:程序博客网 时间:2024/05/17 09:38
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System;


public class AnimatorTools : EditorWindow 
{


[MenuItem("AnimatorTools/复制AnimationClip")]
static void CopyClip()
{
//测试被选择物体的路径:Assets/Art/Model/Character/hero3009/hero3009@attack.FBX
string selectPath = AssetDatabase.GetAssetPath (Selection.activeObject);
Debug.Log ("测试被选择物体的路径:"+selectPath);
string[] str = selectPath.Split ("/"[0]);


//得到的路径:Assets/Art/Model/Character/hero3009/
string _folderAssetPath = selectPath.Substring (0,selectPath.Length-str[str.Length-1].Length);
Debug.Log ("得到的路径:"+_folderAssetPath);


//获取文件夹底下所有文件路径
string projectDataPath = Application.dataPath.Substring (0,Application.dataPath.Length-6);
string[] allFilePath = Directory.GetFiles (projectDataPath+_folderAssetPath,"*",SearchOption.TopDirectoryOnly);
List<string> allAniPath = new List<string> ();


//做个循环让以.FBX结尾的文件放进List中
for (int i = 0; i < allFilePath.Length; i++) 
{
string remove = projectDataPath;
string newPath = allFilePath [i].Remove (0,remove.Length);
if(newPath.Substring(newPath.Length-4,4).Equals(".FBX"))
{
if (newPath.Substring (newPath.Length - 9, 9).Equals("@skin.FBX"))
{
continue;
}
allAniPath.Add (newPath);
Debug.Log("写进allAniPath表中的路径:"+newPath);
}
}


//FBX中读取动作片段
if (allAniPath == null)
return;
for(int i=0;i<allAniPath.Count;i++)
{
AnimationClip newClip = new AnimationClip ();
AnimationClip oldClip = AssetDatabase.LoadAssetAtPath (allAniPath[i],typeof(AnimationClip)) as AnimationClip;
Debug.Log (oldClip.name);
EditorUtility.CopySerialized (oldClip,newClip);
//@--standy和run执行loopTime和 loopPose执行循环--@
if (oldClip.name.Equals ("standby") || oldClip.name.Equals ("run"))
{AnimationClipSettings clipSetting = AnimationUtility.GetAnimationClipSettings (newClip);
clipSetting.loopTime = true;
clipSetting.loopBlend = true;
AnimationUtility.SetAnimationClipSettings (newClip,clipSetting);
}


AssetDatabase.CreateAsset (newClip,_folderAssetPath+newClip.name+".anim");
File.Delete (allAniPath[i]);
}
allAniPath.Clear ();
AssetDatabase.Refresh ();


}
}