Unityに読み込んだfbxのアニメーションを自動で名付けて管理しやすくする
blenderから出力されたアニメーションは、私の環境だと全てroot|Animationで出力される。これでも構わないのだが、Unityで読み込んだ時に様々なfbxファイルの「root|Animation」がずらっと並び、なにがなんだかわからなくなる。
これを解決されるために、fbxに読み込んだ時にある程度自動で名付けするようにした。私はアニメーションファイルをシーンごとにフォルダ分けしているので、フォルダ名-fbx名-アニメーションという感じで名付けるようにした。
using UnityEditor;
using UnityEngine;
using System.IO;
using System.Collections.Generic;
public class RenameFBXAnimations : AssetPostprocessor
{
private static HashSet<string> processedAssets = new HashSet<string>();
void OnPreprocessModel()
{
ModelImporter modelImporter = assetImporter as ModelImporter;
if (modelImporter != null)
{
modelImporter.importAnimation = true;
}
}
void OnPostprocessModel(GameObject g)
{
ModelImporter modelImporter = assetImporter as ModelImporter;
if (modelImporter != null)
{
// アニメーションクリップのリストを取得
ModelImporterClipAnimation[] clipAnimations = modelImporter.defaultClipAnimations;
if (clipAnimations != null && clipAnimations.Length > 0)
{
// アニメーションがある場合、リストに追加
processedAssets.Add(assetPath);
}
}
}
[InitializeOnLoadMethod]
private static void OnEditorLoad()
{
EditorApplication.update += OnEditorUpdate;
}
private static void OnEditorUpdate()
{
if (processedAssets.Count > 0)
{
foreach (string assetPath in processedAssets)
{
RenameAnimationClips(assetPath);
}
processedAssets.Clear();
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
private static void RenameAnimationClips(string assetPath)
{
ModelImporter modelImporter = AssetImporter.GetAtPath(assetPath) as ModelImporter;
if (modelImporter != null)
{
// 親フォルダ名を取得
string folderPath = Path.GetDirectoryName(assetPath).Replace("\\", "/");
string[] pathSegments = folderPath.Split('/');
string parentFolderName = pathSegments[pathSegments.Length - 1];
// FBXファイル名を取得(拡張子なし)
string fbxName = Path.GetFileNameWithoutExtension(assetPath);
// "_rig"を削除
fbxName = fbxName.Replace("_rig", "");
// アニメーションクリップのリストを取得
ModelImporterClipAnimation[] clipAnimations = modelImporter.defaultClipAnimations;
for (int i = 0; i < clipAnimations.Length; i++)
{
// 新しいアニメーションクリップ名を設定
string newClipName = $"{parentFolderName}-{fbxName}-{clipAnimations[i].name}";
// アニメーションクリップの名前を変更
clipAnimations[i].name = newClipName;
}
// 変更を適用
modelImporter.clipAnimations = clipAnimations;
AssetDatabase.WriteImportSettingsIfDirty(assetPath);
}
}
}
RenameFBXAnimations.csという名前にしてEditorディレクトリに収める。これでfbxを読み込む時に自動でアニメーションを名付けてくれる。
なんかfbx読み込み時に処理するタイムスタンプがどうのってエラー吐きまくるので、一旦読み込みが完全に終わった後に弄るようになった。
これでフォルダ名やリグ名をきちんと設定していれば、検索でも探しやすくなる。