Unity 如何批量修改FBX模型
由于模型數(shù)量有點(diǎn)多,并且都要修改參數(shù),還有從里面提取動(dòng)畫(huà)。就搜搜查查,搞了個(gè)小工具,批量的修改 FBX 模型的 參數(shù),以及提取動(dòng)畫(huà)相關(guān)。
using UnityEditor; using UnityEngine; using System.IO; using System.Collections; using System.Collections.Generic; public class ModifyMoidel : Editor { [MenuItem("BenBen/修改模型ModelScal")] public static void ModifyMoidelScale() { List<string> paths = new List<string>(); foreach (Object o in Selection.GetFiltered(typeof(Object), SelectionMode.Assets)) { Debug.Log(o.name); //非對(duì)象不繼續(xù) if (!(o is GameObject)) continue; //將o作為模型存儲(chǔ)在mod中 //Debug.LogWarning(o.name); GameObject mod = o as GameObject; //將mod模型路徑存儲(chǔ)在path中 string path = AssetDatabase.GetAssetPath(mod); ModelImporter modelimporter = ModelImporter.GetAtPath(path) as ModelImporter; if (!modelimporter) { UnityEngine.Debug.LogError(string.Format("path-->{0}<---不是ModelImporter", path)); continue; } //修改Model 下的Scale Factor modelimporter.globalScale = 10; paths.Add(path); AssetDatabase.ImportAsset(path); } AssetDatabase.Refresh(); CreatNewAnimations(paths); } private static void CreatNewAnimations(List<string> paths) { UnityEditor.Animations.AnimatorController animatorController = null; UnityEditor.Animations.AnimatorControllerLayer layer = null; UnityEditor.Animations.AnimatorStateMachine asm = null; Debug.Log(paths.Count); for (int i = 0; i < paths.Count; i++) { paths[i].Replace("\\", "/"); AnimationClip newClip = new AnimationClip(); AnimationClip clip = AssetDatabase.LoadAssetAtPath(paths[i], typeof(AnimationClip)) as AnimationClip; if (!clip) { UnityEngine.Debug.LogError(string.Format("path-->{0}<--不包含AnimationClip", paths[i])); continue; } string fbxName = Path.GetFileNameWithoutExtension(paths[i]); fbxName = fbxName.Substring(fbxName.LastIndexOf("_") + 1); //新的AnimationClip名字 var newClipName = GetAniName(int.Parse(fbxName)) + ".anim"; string directoryPath = paths[i].Replace(Path.GetFileName(paths[i]), "AnimationClip/"); if (!Directory.Exists(directoryPath)) { Directory.CreateDirectory(directoryPath); } EditorCurveBinding[] binding = AnimationUtility.GetCurveBindings(clip); for (int j = 0; j < binding.Length; j++) { AnimationCurve animationCurve = AnimationUtility.GetEditorCurve(clip, binding[j]); AnimationUtility.SetEditorCurve(newClip, binding[j], animationCurve); } //非Legacy動(dòng)畫(huà)使用GetCurveBindings、GetEditorCurve和SetEditorCurve方法 //Legacy要使用GetObjectReferenceCurveBindings、GetObjectReferenceCurve和SetObjectReferenceCurve方法 //設(shè)置AnimationClipSettings AnimationUtility.SetAnimationClipSettings(newClip, AnimationUtility.GetAnimationClipSettings(clip)); string newClipPath = directoryPath + newClipName; AssetDatabase.CreateAsset(newClip, newClipPath); //生成animator if (!animatorController) { animatorController = UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath(directoryPath + "Animator.controller"); layer = animatorController.layers[0]; asm = layer.stateMachine; } //添加到Animator中 UnityEditor.Animations.AnimatorState state = asm.AddState(newClip.name); state.motion = newClip; //如果是Idle 動(dòng)畫(huà),設(shè)置loop if (newClip.name == "Idle") { AnimationClipSettings animationClipSettings = AnimationUtility.GetAnimationClipSettings(newClip); animationClipSettings.loopTime = true; AnimationUtility.SetAnimationClipSettings(newClip, animationClipSettings); layer.stateMachine.defaultState = state; } AssetDatabase.ImportAsset(paths[i]); } AssetDatabase.Refresh(); } private static string GetAniName(int count) { switch (count) { case 1: return "Idle"; case 2: return "2-1"; case 3: return "2-2"; case 4: return "2-3"; case 5: return "2-4"; default: return ""; } } }
如果有更簡(jiǎn)單的實(shí)現(xiàn)方法歡迎各位大佬留言。
補(bǔ)充:Unity 動(dòng)態(tài)修改prefab 同步fbx
有時(shí)候我們想prefab和fbx無(wú)縫切換怎么辦,也就是在unity里調(diào)完效果后不滿意,返回dcc如阿健修改模型,但是prefab上又掛載了東西,不想重拖怎么辦?這時(shí)候prefab variant就又用途了
建立變體,把變體拖到場(chǎng)景里。
或者先拖fbx到場(chǎng)景,再選擇變體放置。
然后修改好模型后,直接再在文件瀏覽器里替換同名prefab
貌似需要到prefab模式里再revert一下
這樣就可以實(shí)現(xiàn)“動(dòng)態(tài)”修改perfab了。沒(méi)改變的話可以右鍵相關(guān)屬性revert
嗯
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
基于C#實(shí)現(xiàn)的仿windows左側(cè)伸縮菜單效果
這篇文章主要介紹了基于C#實(shí)現(xiàn)的仿windows左側(cè)伸縮菜單效果,比較實(shí)用的功能,需要的朋友可以參考下2014-08-08C#實(shí)現(xiàn)List.Sort()使用小計(jì)
在C#開(kāi)發(fā)中,List是常見(jiàn)的一種集合類(lèi)型,其提供了一個(gè) Sort() 方法來(lái)實(shí)現(xiàn)對(duì)集合的排序,本文主要介紹了C#實(shí)現(xiàn)List.Sort()使用小計(jì),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12C#創(chuàng)建、部署、調(diào)用WebService圖文實(shí)例詳解
本文主要用詳細(xì)的圖文給大家介紹C#創(chuàng)建、部署、調(diào)用WebService的全部過(guò)程以及中間需要避免的問(wèn)題。2017-11-11C#/VB.NET實(shí)現(xiàn)從PPT中提取圖片的示例代碼
PPT是用于制作幻燈片(演示文稿)的應(yīng)用軟件,每張幻燈片中都可以包含文字、圖形、圖形、表格、聲音和影像等多種信息。本文主要介紹了如何實(shí)現(xiàn)從PPT中提取圖片的功能,需要的可以參考一下2023-03-03C#更新文本框textbox數(shù)據(jù)同時(shí)刪除舊數(shù)據(jù)問(wèn)題
這篇文章主要介紹了C#更新文本框textbox數(shù)據(jù)同時(shí)刪除舊數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04C#微信公眾號(hào)開(kāi)發(fā)之接收事件推送與消息排重的方法
這篇文章主要介紹了C#微信公眾號(hào)開(kāi)發(fā)之接收事件推送與消息排重的方法,詳細(xì)分析了事件推送與消息排重的使用技巧,對(duì)微信開(kāi)發(fā)有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01Unity實(shí)現(xiàn)鼠標(biāo)拖動(dòng)3D物體
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)鼠標(biāo)拖動(dòng)3D物體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10C# 快速高效率復(fù)制對(duì)象(表達(dá)式樹(shù))
在代碼中經(jīng)常會(huì)遇到需要把對(duì)象復(fù)制一遍,或者把屬性名相同的值復(fù)制一遍。本文將對(duì)其解決方法進(jìn)行詳細(xì)介紹。下面跟著小編一起來(lái)看下吧2017-04-04