Unity FBX动画批量处理

外部向unity导入fbx格式的动画,很多东西要批量修改,比如名称,动画设置啥的,下面记录下批处理流程

1. 手动全选修改rig为human,这个并不麻烦,选中模型avatar就可以生成了
在这里插入图片描述

2. 更正动画名称,修改动画属性

在这里插入图片描述

直接贴代码吧:

public class AnimationToolEditor : OdinEditorWindow
{
    [MenuItem("Tools/AnimationTool")]
    private static void OpenWindow()
    {
        GetWindow<AnimationToolEditor>().Show();
    }


    private string newPath;
    private bool HasPath=>!string.IsNullOrEmpty(newPath);
    private string SelectPath()
    {
        return EditorUtility.OpenFolderPanel("Select Folder", "", "");
    }


    [Button("选择导出路径"),PropertyOrder(0)]
    public void SelectNewPath()
    {
        newPath = SelectPath();
    }

    private string Info=>string.IsNullOrEmpty(newPath)?"尚未选择导出路径":
     "已经选择路径:  "  +newPath+   "  点下边的提取,选择FBX文件夹,即可提取动画";

    [InfoBox("@Info",InfoMessageType.Info)]
    [Button("提取"),EnableIf(nameof(HasPath)),PropertyOrder(2)]
    public  void Seperate()
    {

        var selectedFolderPath = EditorUtility.OpenFolderPanel("Select Folder", "", "");



        //获取该目录下所有.FBX后缀的文件
        var files = Directory.GetFiles(selectedFolderPath, "*.FBX", SearchOption.AllDirectories);

        for(int i = 0; i < files.Length; i++)
        {
            var file = files[i];
            //获得该路径再asset下的相对路径
            var assetPath = file.Replace(Application.dataPath, "Assets");
            var fileName = Path.GetFileNameWithoutExtension(file);
            
            var modelImporter= AssetImporter.GetAtPath(assetPath) as ModelImporter;


            var tempClip= modelImporter.defaultClipAnimations[0];
            tempClip.name = fileName;
            tempClip.keepOriginalOrientation = true;
            tempClip.lockRootRotation = true;
            tempClip.keepOriginalPositionY = true;
            tempClip.lockRootHeightY = true;

            //如果动画名称包含root就不锁定xz位移
            if (fileName.Contains("root")|| fileName.Contains("Root"))
            {
                Debug.Log("包含root");
                tempClip.lockRootPositionXZ = false;
                tempClip.keepOriginalPositionXZ = true;
            }
            else
            {
                tempClip.lockRootPositionXZ = true;
                tempClip.keepOriginalPositionXZ = true;
            }


            tempClip.loopTime = true;
            modelImporter.clipAnimations = new[] { tempClip };

            modelImporter.SaveAndReimport();

            var filePath = Path.GetDirectoryName(file);
            AnimationClip oldClip=AssetDatabase.LoadAssetAtPath<AnimationClip>(assetPath);
            
            //复制oldClip到Clips文件夹下
            AnimationClip newClip = new();
            EditorUtility.CopySerialized(oldClip, newClip);
            var clipPath=newPath.Replace(Application.dataPath, "Assets");
            AssetDatabase.CreateAsset(newClip, clipPath + "/" + fileName + ".anim");
            AssetDatabase.Refresh();




            
        }
    }

这里只是大略修改,关于root动画后面使用的时候还是要回来再调的

3.接下来就要调整动画精度了

在这里插入图片描述

这里我没有使用unity基本的调整办法,用的是插件Final IK提供的方式,效果比unity内置的好不少(更小的体积,精度也不差)
在这里插入图片描述

直接来到Final IK 提供的demo场景就可以操作了,把所有clip丢到这个list里面(记得选一下下面的导出目录),运行场景,Inspector上的脚本就会多出一个bake的按钮,点一下就大功告成了.
来看一下文件大小比对:
在这里插入图片描述
导出动画后,动画原文件最好还是不要删掉,在以后的使用中难免要回头调整动画.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值