中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Unity怎么批量修改FBX模型

發布時間:2021-04-12 15:41:24 來源:億速云 閱讀:704 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關使用Unity怎么批量修改FBX模型,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

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);
            //非對象不繼續
            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方法
            //設置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 動畫,設置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 "";
        }
    }
}

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

補充:Unity 動態修改prefab 同步fbx

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

使用Unity怎么批量修改FBX模型

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

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

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

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

這樣就可以實現“動態”修改perfab了。沒改變的話可以右鍵相關屬性revert

使用Unity怎么批量修改FBX模型

使用Unity怎么批量修改FBX模型

以上就是使用Unity怎么批量修改FBX模型,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

招远市| 思南县| 乌什县| 乐都县| 班戈县| 汤阴县| 柏乡县| 东安县| 大余县| 色达县| 融水| 涞源县| 利川市| 嘉黎县| 天气| 南安市| 宁陵县| 蕲春县| 东乌珠穆沁旗| 三亚市| 黄大仙区| 宁蒗| 康乐县| 明星| 呈贡县| 邹平县| 临安市| 遵化市| 定州市| 双桥区| 正定县| 吴旗县| 肥西县| 永宁县| 松阳县| 会泽县| 修水县| 铜川市| 景东| 同江市| 沂水县|