この投稿では非常に単純なAnimatorControllerを生成するEditor拡張コードを紹介します。
非常に単純とは
- レイヤーは一つのみ
- 生成に複数の
AnimationClip
を用い、それと同じ名前の状態を持つ - 状態遷移なし
- パラメータなし
です。
※この投稿で示すコードは一部UnityEditorInternal名前空間下のコードを用いています。この箇所は、Unityのバージョンアップに伴い内部の実装が変更されて、該当箇所が使えなくなる可能性があります。またこのコードの利用は自己責任でお願いいたします。
ソースコード
下記に示すSimpleAnimatorControllerDefinition
は、作成したいAnimatorControllerの定義用のクラスです。
using UnityEngine;
using System.Collections.Generic;
public class SimpleAnimatorControllerDefinition
{
public List<AnimationClip> AnimationClipList { get; set; }
public string LayerName { get; set; }
public string ResulutPath { get; set; }
}
下記に示すSimpleAnimatorControllerCreator
はSimpleAnimatorControllerDefinition
をもとにAnimatorControllerを生成するためのコードです。
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
public static class SimpleAnimatorControllerCreator
{
public static RuntimeAnimatorController CreateAnimatorController (SimpleAnimatorControllerDefinition definition)
{
AnimatorController animatorController = AnimatorController.CreateAnimatorControllerAtPath (definition.ResulutPath);
StateMachine stateMachine = animatorController.GetLayer (0).stateMachine;
foreach (AnimationClip clip in definition.AnimationClipList) {
State state = stateMachine.AddState (clip.name);
state.SetAnimationClip (clip);
}
EditorUtility.SetDirty (animatorController);
return animatorController;
}
}
UnityEditorInternalのクラス
上記のコードではAnimatorControllerというクラスを用いています。このクラスは、UnityEditorInternalという名前空間に所属しています。その名の示す通り内部で用いるクラスであり、内部の実装が変わればこのコードは動かなくなる可能性は大いにあります。
AnimatorControllerクラスを用いることで、UnityEngine.RuntimeAnimatorControllerではできないAnimatorController
(拡張子.controller)の生成を行うことが可能です。
上記のコードでは、SimpleAnimatorControllerDefinitionを基に、ひとつだけLayerを作成し、AnimationClipから状態を生成しています。
※このコードの利用は自己責任でお願いいたします。
利用例(呼び出すコード)
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Linq;
public static class SimpleAnimatorControllerCaller
{
[MenuItem("Assets/Create AnimatorController")]
public static void CreateAnimatorController ()
{
IEnumerable<AnimationClip> animationClips = Selection.objects.OfType<AnimationClip> ();
if (!animationClips.Any ()) {
Debug.LogWarning ("Please selecting animation clips.");
return;
}
SimpleAnimatorControllerDefinition definition = new SimpleAnimatorControllerDefinition {
AnimationClipList = animationClips.ToList (),
LayerName = "Base Layer",
ResulutPath = "Assets/Sample.controller",
};
SimpleAnimatorControllerCreator.CreateAnimatorController (definition);
}
}
アニメーションクリップを選択した状態で、メニューからAssets -> Create AnimatorController
を選択してください。
ちょっと補足
今回はやっていませんが、状態遷移の定義や、パラメータの設定も可能なようです。
状態が一つで良いのであれば、string型の出力先のpathとその状態で再生するAnimationClipを引数にとる、次のようなメソッドもあります。
AnimatorContrller animatorController = AnimatorController.CreateAnimatorControllerAtPathWithClip (path, animationClip);
参考・関連リンク
UnityManual AnimatorControllerCreation