欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity 如何批量修改FBX模型

 更新時間:2021年04月10日 13:12:12   投稿:jingxian  
這篇文章主要介紹了Unity 批量修改FBX模型的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

由于模型數(shù)量有點多,并且都要修改參數(shù),還有從里面提取動畫。就搜搜查查,搞了個小工具,批量的修改 FBX 模型的 參數(shù),以及提取動畫相關(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);
            //非對象不繼續(xù)
            if (!(o is GameObject))
                continue;
            //將o作為模型存儲在mod中
            //Debug.LogWarning(o.name);
            GameObject mod = o as GameObject;
            //將mod模型路徑存儲在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動畫使用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 動畫,設(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 "";
        }
    }
}

如果有更簡單的實現(xiàn)方法歡迎各位大佬留言。

補充:Unity 動態(tài)修改prefab 同步fbx

有時候我們想prefab和fbx無縫切換怎么辦,也就是在unity里調(diào)完效果后不滿意,返回dcc如阿健修改模型,但是prefab上又掛載了東西,不想重拖怎么辦?這時候prefab variant就又用途了

建立變體,把變體拖到場景里。

或者先拖fbx到場景,再選擇變體放置。

然后修改好模型后,直接再在文件瀏覽器里替換同名prefab

貌似需要到prefab模式里再revert一下

這樣就可以實現(xiàn)“動態(tài)”修改perfab了。沒改變的話可以右鍵相關(guān)屬性revert

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 基于C#實現(xiàn)的仿windows左側(cè)伸縮菜單效果

    基于C#實現(xiàn)的仿windows左側(cè)伸縮菜單效果

    這篇文章主要介紹了基于C#實現(xiàn)的仿windows左側(cè)伸縮菜單效果,比較實用的功能,需要的朋友可以參考下
    2014-08-08
  • C#實現(xiàn)List.Sort()使用小計

    C#實現(xiàn)List.Sort()使用小計

    在C#開發(fā)中,List是常見的一種集合類型,其提供了一個 Sort() 方法來實現(xiàn)對集合的排序,本文主要介紹了C#實現(xiàn)List.Sort()使用小計,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • C#創(chuàng)建、部署、調(diào)用WebService圖文實例詳解

    C#創(chuàng)建、部署、調(diào)用WebService圖文實例詳解

    本文主要用詳細(xì)的圖文給大家介紹C#創(chuàng)建、部署、調(diào)用WebService的全部過程以及中間需要避免的問題。
    2017-11-11
  • 輕松學(xué)習(xí)C#的方法

    輕松學(xué)習(xí)C#的方法

    輕松學(xué)習(xí)C#的方法,對C#的方法感興趣的朋友可以參考本篇文章,幫助大家更靈活的運用C#的方法
    2015-11-11
  • C#/VB.NET實現(xiàn)從PPT中提取圖片的示例代碼

    C#/VB.NET實現(xiàn)從PPT中提取圖片的示例代碼

    PPT是用于制作幻燈片(演示文稿)的應(yīng)用軟件,每張幻燈片中都可以包含文字、圖形、圖形、表格、聲音和影像等多種信息。本文主要介紹了如何實現(xiàn)從PPT中提取圖片的功能,需要的可以參考一下
    2023-03-03
  • C#更新文本框textbox數(shù)據(jù)同時刪除舊數(shù)據(jù)問題

    C#更新文本框textbox數(shù)據(jù)同時刪除舊數(shù)據(jù)問題

    這篇文章主要介紹了C#更新文本框textbox數(shù)據(jù)同時刪除舊數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • C#微信公眾號開發(fā)之接收事件推送與消息排重的方法

    C#微信公眾號開發(fā)之接收事件推送與消息排重的方法

    這篇文章主要介紹了C#微信公眾號開發(fā)之接收事件推送與消息排重的方法,詳細(xì)分析了事件推送與消息排重的使用技巧,對微信開發(fā)有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • C#中可空類型的使用

    C#中可空類型的使用

    本文主要介紹了C#中可空類型的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Unity實現(xiàn)鼠標(biāo)拖動3D物體

    Unity實現(xiàn)鼠標(biāo)拖動3D物體

    這篇文章主要為大家詳細(xì)介紹了Unity實現(xiàn)鼠標(biāo)拖動3D物體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C# 快速高效率復(fù)制對象(表達(dá)式樹)

    C# 快速高效率復(fù)制對象(表達(dá)式樹)

    在代碼中經(jīng)常會遇到需要把對象復(fù)制一遍,或者把屬性名相同的值復(fù)制一遍。本文將對其解決方法進(jìn)行詳細(xì)介紹。下面跟著小編一起來看下吧
    2017-04-04

最新評論