Skip to content

Instantly share code, notes, and snippets.

@keijiro
Last active September 25, 2022 03:47
Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save keijiro/fde84ff347a6747bcf6b to your computer and use it in GitHub Desktop.
Save keijiro/fde84ff347a6747bcf6b to your computer and use it in GitHub Desktop.
[Unity] アニメーションのインポート設定を自動化する

アニメーションのインポート設定を自動化する

Unity のアニメーションのインポート設定(下画像)には様々な項目がありますが、これを手動でひとつひとつ設定していくのは、かなりしんどいです。お決まりの設定がある場合には、スクリプトで自動化してしまうのがよいでしょう。この文書では、その自動化の方法を紹介します。

Animation Clip Settings

スクリプトからオプションを変更する

これらのインポート設定は ModelImporter.clipAnimationsModelImporterClipAnimation の配列として格納されています。これを舐める形で変更していけば、一括でお好みの設定を適用できます。

例として ”Root Transform Position (Y)” に以下のような設定を行うスクリプトを組んでみます。

  • Bake Into Pose をオン
  • Based Upon を “Feet” に設定
  • Offset を -0.1 に設定

次のようなスクリプトになります。

static void SetAnimationImporterSettings(ModelImporter importer)
{
    var clips = importer.clipAnimations;

    if (clips.Length == 0) clips = importer.defaultClipAnimations;
    
    foreach (var clip in clips) {
        clip.lockRootHeightY = true;
        clip.keepOriginalPositionY = false;
        clip.heightFromFeet = true;
        clip.heightOffset = -0.1f;
    }
    
    importer.clipAnimations = clips;
}

このスクリプトを実行する方法は2通り考えられます。

  • FBX ファイルのインポートが発生したら自動的に実行
  • マウスで選択した FBX ファイルに対して手動で実行

インポート時の自動実行

自動実行するには OnPreprocessAnimation を使います。

void OnPreprocessAnimation()
{
    SetAnimationImporterSettings(assetImporter as ModelImporter);
}

これだけだと全ての FBX ファイルに対して勝手に適用されますので、実際にはファイル名とか格納パスとかで適当に仕分けする仕組みが必要かもしれません。

選択ファイルに対しての手動実行

Project View 上で選択した FBX ファイルに対して手動で実行したい場合には、次のように MenuItem として定義するのがよいでしょう。

[MenuItem("Assets/Set Animation Options")]
static void SetAnimationOptions()
{
    var filtered = Selection.GetFiltered(typeof(GameObject), SelectionMode.Assets);
    foreach (var go in filtered) {
        var path = AssetDatabase.GetAssetPath(go);
        var importer = AssetImporter.GetAtPath(path);
        SetAnimationImporterSettings(importer as ModelImporter);
        AssetDatabase.ImportAsset(path);
    }
    Selection.activeObject = null;
}

これで FBX ファイルを選択したあとの右クリックメニューから実行できるようになります。

プロパティ名と設定項目の対応

ModelImporterClipAnimation のプロパティ名は若干わかりにくいところがあります。例えば、Inspector 上では “Bake Into Pose” とラベルされている項目が、プロパティ名では “LockRootHeightY” という名前に変わっていたりします。”Bake” は “Lock”、というふうに読み替えて解釈してください。

あと分かりにくいのは、”Based Upon” のドロップダウンリストの設定方法でしょうか。

Root Transform Rotation については、keepOriginalOrientation が true か false かによって、ドロップダウンの選択状態が変わります。true なら “Original”、false なら “Body Orientation” という感じですね。Root Transform Position (XZ) も同じような感じです。

Root Transform Position (Y) については、keepOriginalPositionYheightFromFeet の組み合わせによって変化します。両方が false の場合は “Center of Mass” が選択されます(両方が true の場合はどうなんだろう……とかは考えないでください)。

using UnityEngine;
using UnityEditor;
using System.Collections;
public class AnimationProcessor : AssetPostprocessor
{
static void SetAnimationImporterSettings(ModelImporter importer)
{
var clips = importer.clipAnimations;
if (clips.Length == 0) clips = importer.defaultClipAnimations;
foreach (var clip in clips) {
clip.lockRootHeightY = true;
clip.keepOriginalPositionY = false;
clip.heightFromFeet = true;
clip.heightOffset = -0.1f;
}
importer.clipAnimations = clips;
}
void OnPreprocessAnimation()
{
SetAnimationImporterSettings(assetImporter as ModelImporter);
}
[MenuItem("Assets/Set Animation Options", true)]
static bool SetAnimationOptionsValidate()
{
return Selection.GetFiltered(typeof(GameObject), SelectionMode.Assets).Length > 0;
}
[MenuItem("Assets/Set Animation Options")]
static void SetAnimationOptions()
{
var filtered = Selection.GetFiltered(typeof(GameObject), SelectionMode.Assets);
foreach (var go in filtered) {
var path = AssetDatabase.GetAssetPath(go);
var importer = AssetImporter.GetAtPath(path);
SetAnimationImporterSettings(importer as ModelImporter);
AssetDatabase.ImportAsset(path);
}
Selection.activeObject = null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment