ScriptableObjectからAnimationClip作成
 前回言ってた、フレームアニメーションの作成スクリプト。
 (フレームアニメーションはいわゆるパタパタマンガのことを指してる……でいいと思う)
 最終的にはAnimatorControllerが一発で作成できればいいなあ、と考えているのだけど、どこまで機能を持たせるべきか決めるのがタイヘンなのと、どうやらかなり黒魔術じみたことをしなきゃいけないらしいぞ、てなわけで、まだそこまでやらない。やるかどうかも分からない。
 今回はAnimationClipの作成までを行う。
まずはScriptableObjectの定義。
using UnityEngine; using System.Collections; public class FrameAnimation : ScriptableObject { [System.Serializable] public class Frame { public float time; public Sprite sprite; } public Frame[] frames; }
そしてインスペクタ拡張で、アニメーション作成機能をつける。
    using System.IO;
    using UnityEditor;
    using UnityEngine;
    [CustomEditor(typeof(FrameAnimation))]
    public class FrameAnimationEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            DrawDefaultInspector();
            if (GUILayout.Button("Create Animation"))
            {
                var frameAnimation = (FrameAnimation)target;
                string path = GenerateUniqueAssetPath(frameAnimation, "anim");
                var obj = CreateAnimationClip(frameAnimation);
                obj.name = frameAnimation.name;
                AssetDatabase.CreateAsset(obj, path);
                EditorUtility.SetDirty(obj);
            }
        }
        static public string GenerateUniqueAssetPath(Object selectedObject, string extension)
        {
            string objectName = selectedObject.name;
            string dirPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(selectedObject));
            string path = string.Format("{0}/{1}." + extension, dirPath, objectName);
            return AssetDatabase.GenerateUniqueAssetPath(path);
        }
        public static AnimationClip CreateAnimationClip(FrameAnimation frameAnimation)
        {
            AnimationClip animClip = new AnimationClip();
            EditorCurveBinding curveBinding = new EditorCurveBinding();
            curveBinding.type = typeof(SpriteRenderer);
            curveBinding.path = "";
            curveBinding.propertyName = "m_Sprite";
            ObjectReferenceKeyframe[] keyFrames = new ObjectReferenceKeyframe[frameAnimation.frames.Length];
            for (int i = 0; i < frameAnimation.frames.Length; i++)
            {
                keyFrames[i] = new ObjectReferenceKeyframe();
                keyFrames[i].time = frameAnimation.frames[i].time;
                keyFrames[i].value = frameAnimation.frames[i].sprite;
            }
            AnimationUtility.SetAnimationType(animClip, ModelImporterAnimationType.Generic);
            AnimationUtility.SetObjectReferenceCurve(animClip, curveBinding, keyFrames);
            return animClip;
        }
    }
ちなみに、だいたいここに書いてある。