Unity のアニメーションのインポート設定(下画像)には様々な項目がありますが、これを手動でひとつひとつ設定していくのは、かなりしんどいです。お決まりの設定がある場合には、スクリプトで自動化してしまうのがよいでしょう。この文書では、その自動化の方法を紹介します。
これらのインポート設定は ModelImporter.clipAnimations に ModelImporterClipAnimation の配列として格納されています。これを舐める形で変更していけば、一括でお好みの設定を適用できます。
例として ”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) については、keepOriginalPositionY と heightFromFeet の組み合わせによって変化します。両方が false の場合は “Center of Mass” が選択されます(両方が true の場合はどうなんだろう……とかは考えないでください)。