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読み込み時に処理するタイムスタンプがどうのってエラー吐きまくるので、一旦読み込みが完全に終わった後に弄るようになった。

これでフォルダ名やリグ名をきちんと設定していれば、検索でも探しやすくなる。


いいなと思ったら応援しよう!