文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-14 11:43

关注

本篇文章给大家分享的是有关使用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模型,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯