7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-01-11

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

 非常に単純とは

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

 です。

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

ソースコード

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

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; }
}

 下記に示すSimpleAnimatorControllerCreatorSimpleAnimatorControllerDefinitionをもとにAnimatorControllerを生成するためのコードです。

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から状態を生成しています。

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

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

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

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

参考・関連リンク

UnityManual AnimatorControllerCreation

関連投稿

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?