提取Unity中的fbx文件中的動畫片段弯淘。

提取Unity中的fbx文件中的動畫片段您觉。

整體思路是:

將fbx加載后,獲取AnimationClip信息拖吼,然后序列滑到新文件中鳞上。

// 生成新的AnimationClip

? ? ? ? ? ? ? ? ? ? ? ? AnimationClip newClip = new AnimationClip();

? ? ? ? ? ? ? ? ? ? ? ? newClip.frameRate = 25;

? ? ? ? ? ? ? ? ? ? ? ? newClip.name = objs[j].name;

? ? ? ? ? ? ? ? ? ? ? ? // 復制數(shù)據(jù)

? ? ? ? ? ? ? ? ? ? ? ? // 方法1:該方法僅設置有效數(shù)據(jù),編輯器相關數(shù)據(jù)不會設置到導出資源中

? ? ? ? ? ? ? ? ? ? ? ? EditorUtility.CopySerialized(objs[j], newClip);


直接上代碼:

public class AnimationExporter : AssetBaseExporter { public class FbxInfo { public string m_AssetPath; public string m_AssetName; // 資源名 public bool m_IsExport; // 是否導出 public bool m_IsCompress; //是否壓縮 } string m_AssetPathPrefix = "Assets/Resources/Models"; // 資源路徑前綴(所有需要導出動畫的fbx以該目錄為根目錄绿贞,不同的模型可以在該目錄下新建子目錄) string m_AssetExportPathPrefix = "Assets/Resources/Pack/Ani"; Listm_AssetList; bool m_IsCompress = true; bool m_IsSelectAll = true; Vector2 m_ScrollPos = Vector2.zero; protected override string m_AssetFilter { get { return "t:model"; } } public override string m_ActionResultFileName { get { return "AnimExportResult.txt"; } } public override void Init() { m_ExportResultDict = new Dictionary(); } public override void Draw() { if (m_AssetList == null) { GUI.contentColor = Color.red; EditorGUILayout.TextArea("請選擇資源目錄或者某個導出資源"); GUI.contentColor = Color.white; return; } if (GUILayout.Button("一鍵全選/一鍵取消全選", GUILayout.Height(50))) { m_IsSelectAll = !m_IsSelectAll; for (int idx = 0; idx < m_AssetList.Count; ++idx) { FbxInfo fbxInfo = m_AssetList[idx]; fbxInfo.m_IsExport = m_IsSelectAll; fbxInfo.m_IsCompress = m_IsSelectAll; } } m_ScrollPos = EditorGUILayout.BeginScrollView(m_ScrollPos, false, false); for (int idx = 0; idx < m_AssetList.Count; ++idx) { FbxInfo fbxInfo = m_AssetList[idx]; fbxInfo.m_IsExport = EditorGUILayout.BeginToggleGroup("勾選", fbxInfo.m_IsExport); // 組開始 EditorGUILayout.TextField(fbxInfo.m_AssetName,GUILayout.Width(500)); EditorGUILayout.EndToggleGroup(); // 組結(jié)束 fbxInfo.m_IsCompress = EditorGUILayout.BeginToggleGroup("勾選", fbxInfo.m_IsCompress); // 組開始 EditorGUILayout.TextField("是否壓縮", GUILayout.Width(500)); EditorGUILayout.EndToggleGroup(); // 組結(jié)束 } EditorGUILayout.EndScrollView(); } public override void PreAction() { base.PreAction(); AnimationModelCompresser.GetInstance().Init(); CompressAnimationExcludeInfoMgr.GetInstance().Init(); } public override void DoAction(string resPath, bool isPath) { if (isPath) { for (int idx = 0; idx < m_AssetList.Count; ++idx) { if (m_AssetList[idx].m_IsExport) { m_IsCompress = m_AssetList[idx].m_IsCompress; DoAction(m_AssetList[idx].m_AssetPath); } } AssetDatabase.Refresh(); } else { base.DoAction(resPath, isPath); } } protected override void DoAction(string assetPath) { if (!assetPath.Contains(m_AssetPathPrefix)) return; Object obj = AssetDatabase.LoadAssetAtPath(assetPath, typeof(GameObject)); if (obj == null) return; if (PrefabUtility.GetPrefabType(obj) == PrefabType.ModelPrefab) { // 創(chuàng)建導出目錄 string exportPath = assetPath.Replace(m_AssetPathPrefix, m_AssetExportPathPrefix); exportPath = Application.dataPath.Replace("Assets", exportPath); exportPath = exportPath.Substring(0, exportPath.LastIndexOf("/") + 1); EditorBasePanel.CheckTargetPath(exportPath); GameObject gameObj = GameObject.Instantiate(obj) as GameObject; if (gameObj.GetComponent() == null) { GameObject.DestroyImmediate(gameObj); return; } gameObj.GetComponent().clip = null; if (m_IsCompress) { DictionaryerrorDic = new Dictionary(); AnimationModelCompresser.IsCollectErrorInfo = true; if (AnimationModelCompresser.GetInstance().CompressAnimationModel(assetPath, out errorDic) && errorDic.Count > 0) { // 排序 List> lst = new List>(errorDic); lst.Sort(delegate(KeyValuePairs1, KeyValuePairs2) { return s2.Value.CompareTo(s1.Value); }); foreach (KeyValuePairerrorPair in lst) { SaveAsClips(assetPath, errorPair.Value, errorPair.Key, gameObj, exportPath); } float minError = Mathf.Infinity; foreach (KeyValuePairpair in errorDic) { minError = Mathf.Min(minError, pair.Value); } errorDic.Clear(); // 設置回原來的 ImportSettingsHelper.SetImportSettingsCompressionError(assetPath, minError); } else { SaveAsClips(assetPath, 0, string.Empty, gameObj, exportPath); } } else { SaveAsClips(assetPath, 0, string.Empty, gameObj, exportPath); } // 導出prefab string prefabPath = exportPath.Replace(Application.dataPath, "Assets") + obj.name + ".prefab"; //PrefabUtility.CreatePrefab(prefabPath, gameObj); GameObject.DestroyImmediate(gameObj); } EditorUtility.UnloadUnusedAssets(); } void SaveAsClips(string assetPath, float errorValue, string clipName, GameObject gameObj, string exportPath) { if (errorValue > 0) { ImportSettingsHelper.SetImportSettingsCompressionError(assetPath, errorValue); } Object[] objs = AssetDatabase.LoadAllAssetsAtPath(assetPath); for (int j = 0; j < objs.Length; ++j) { if ((objs[j].GetType()) == typeof(AnimationClip)) { if (string.IsNullOrEmpty(clipName) || objs[j].name == clipName) { //UnityEngine.Debug.Log(objs[j].name); AnimationState state = gameObj.GetComponent()[objs[j].name]; if (state == null) continue; // 生成新的AnimationClip AnimationClip newClip = new AnimationClip(); newClip.frameRate = 25; newClip.name = objs[j].name; // 復制數(shù)據(jù) // 方法1:該方法僅設置有效數(shù)據(jù)因块,編輯器相關數(shù)據(jù)不會設置到導出資源中 EditorUtility.CopySerialized(objs[j], newClip); // 方法2:該方法會將編輯器相關數(shù)據(jù)設置到導出資源中 /* EditorCurveBinding[] bindings = AnimationUtility.GetCurveBindings(objs[j] as AnimationClip); for (int bindIdx = 0; bindIdx < bindings.Length; ++bindIdx) { AnimationCurve curve = AnimationUtility.GetEditorCurve(objs[j] as AnimationClip, bindings[bindIdx]); AnimationUtility.SetEditorCurve(newClip, bindings[bindIdx], curve); } // * */ /* // 方法3:該方法會將編輯器相關數(shù)據(jù)設置到導出資源中 AnimationClipCurveData[] curveDatas = AnimationUtility.GetAllCurves(objs[j] as AnimationClip, true); for (int curIdx = 0; curIdx < curveDatas.Length; ++curIdx) { AnimationClipCurveData curve = curveDatas[curIdx]; AnimationUtility.SetEditorCurve(newClip, curve.path, curve.type, curve.propertyName, curve.curve); } * */ // 導出動畫 string animPath = exportPath.Replace(Application.dataPath, "Assets") + objs[j].name + ".anim"; AssetDatabase.CreateAsset(newClip, animPath); string resultPath = animPath.Replace(m_AssetExportPathPrefix, "Resources/Pack/Ani"); resultPath = resultPath.Replace(".anim", ""); AddActionResult(assetPath, resultPath); // 移除動畫 gameObj.GetComponent().RemoveClip(objs[j].name); } } } } public override void OnSelectPath(string path, bool isPath) { if (isPath) { m_AssetList = new List(); path = path.Replace(Application.dataPath, "Assets"); string[] assets = AssetDatabase.FindAssets(m_AssetFilter, new string[] { path }); if (assets != null) { for (int idx = 0; idx < assets.Length; ++idx) { string assetPath = AssetDatabase.GUIDToAssetPath(assets[idx]); FbxInfo fbxInfo = new FbxInfo(); fbxInfo.m_AssetPath = assetPath; fbxInfo.m_AssetName = Path.GetFileName(assetPath); fbxInfo.m_IsExport = true; fbxInfo.m_IsCompress = true; m_AssetList.Add(fbxInfo); } } } else { path = path.Replace(Application.dataPath, "Assets"); path = path.Substring(0, path.LastIndexOf("/")); m_AssetList = new List();

? ? ? ? ? ? ? ? FbxInfo fbxInfo = new FbxInfo();

? ? ? ? ? ? ? ? fbxInfo.m_AssetPath = path;

? ? ? ? ? ? ? ? fbxInfo.m_AssetName = Path.GetFileName(path);

? ? ? ? ? ? ? ? fbxInfo.m_IsExport = true;

? ? ? ? ? ? ? ? fbxInfo.m_IsCompress = true;

? ? ? ? ? ? ? ? m_AssetList.Add(fbxInfo);

? ? ? ? ? ? }

? ? ? ? }

? ? }

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市籍铁,隨后出現(xiàn)的幾起案子涡上,更是在濱河造成了極大的恐慌趾断,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吩愧,死亡現(xiàn)場離奇詭異芋酌,居然都是意外死亡,警方通過查閱死者的電腦和手機雁佳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門脐帝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糖权,你說我怎么就攤上這事堵腹。” “怎么了星澳?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵疚顷,是天一觀的道長。 經(jīng)常有香客問我禁偎,道長腿堤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任如暖,我火速辦了婚禮笆檀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盒至。我一直安慰自己酗洒,他們只是感情好,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布妄迁。 她就那樣靜靜地躺著寝蹈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪登淘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天封字,我揣著相機與錄音黔州,去河邊找鬼。 笑死阔籽,一個胖子當著我的面吹牛流妻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笆制,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼绅这,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了在辆?” 一聲冷哼從身側(cè)響起证薇,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤度苔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浑度,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寇窑,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年箩张,在試婚紗的時候發(fā)現(xiàn)自己被綠了甩骏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡先慷,死狀恐怖饮笛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情论熙,我是刑警寧澤福青,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站赴肚,受9級特大地震影響素跺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜誉券,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一指厌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踊跟,春花似錦踩验、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拳昌,卻和暖如春袭异,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炬藤。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工御铃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沈矿。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓上真,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羹膳。 傳聞我的和親對象是個殘疾皇子睡互,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容

  • public class ImageProcessHelper { ///////////////////////...
    學習不斷閱讀 2,629評論 0 1
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,453評論 0 17
  • #幸福是需要修出來的~每天進步1%~幸福實修08班~14-申屠楓艷-富陽# 20170817(60/99) 【幸福...
    幸福實修申屠閱讀 109評論 0 0
  • 嗨,又到周末了就珠!平淡無奇的一天寇壳,該怎樣規(guī)劃?安靜的喝一壺清茶嗓违,還是冥想放空一整天九巡?慵懶的陽光擁抱自己一整天。拿起喜...
    肥肉先生閱讀 231評論 0 0
  • 每日推薦民宿:今天推薦位于莫干山的望云山居蹂季。這一家民宿是我目前去過民宿當中最安靜的一家冕广,每個人心中都有一個自己的桃...
    民宿星探阿巧閱讀 793評論 0 0