非常に単純なAnimatorControllerを生成するEditor拡張コード

　この投稿では非常に単純なAnimatorControllerを生成するEditor拡張コードを紹介します。

　非常に単純とは


* レイヤーは一つのみ
* 生成に複数の`AnimationClip`を用い、それと同じ名前の状態を持つ
* 状態遷移なし
* パラメータなし

　です。

　※この投稿で示すコードは一部UnityEditorInternal名前空間下のコードを用いています。この箇所は、Unityのバージョンアップに伴い内部の実装が変更されて、該当箇所が使えなくなる可能性があります。またこのコードの利用は自己責任でお願いいたします。

# ソースコード

　下記に示す`SimpleAnimatorControllerDefinition`は、作成したいAnimatorControllerの定義用のクラスです。


```csharp:SimpleAnimatorControllerDefinition.cs
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を生成するためのコードです。

```csharp:SimpleAnimatorControllerCreator.cs
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から状態を生成しています。


　※このコードの利用は自己責任でお願いいたします。


# 利用例(呼び出すコード)

```csharp:SimpleAnimatorControllerCaller
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を引数にとる、次のようなメソッドもあります。

```csharp:	
AnimatorContrller animatorController = AnimatorController.CreateAnimatorControllerAtPathWithClip (path, animationClip);
```


# 参考・関連リンク

[UnityManual AnimatorControllerCreation](http://docs.unity3d.com/Manual/AnimatorControllerCreation.html)

# 関連投稿

* [縦横の分割数を指定し一枚の画像をMultiple Spriteに分割するEditor拡張コード](http://qiita.com/RyotaMurohoshi/items/b01e3cdb91fea96f4574)
* [複数枚のSpriteからAnimationClipを生成するEditor拡張コード](http://qiita.com/RyotaMurohoshi/items/5cb865c23a50055cf92f)
* [プロジェクトに新たなPrefabを生成するためのEditor拡張コード](http://qiita.com/RyotaMurohoshi/items/ce01b8f5221a31a5a5e6)