外部向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的按钮,点一下就大功告成了.
来看一下文件大小比对:
导出动画后,动画原文件最好还是不要删掉,在以后的使用中难免要回头调整动画.