AnimationCurveをC#コードに逆変換

Convert AnimationCurve to C# code text

AnimationCurveの値を、C#ソースコードのテキストに逆変換するちょっとしたコード塊を置いておきます。

↓ AnimationCurveエディターで編集したカーブを



↓ こんなテキストに変換します。

AnimationCurve curve = new AnimationCurve();

curve.AddKey( new Keyframe(0f,0f,2f,2f) );

curve.AddKey( new Keyframe(0.2859742f,0.7250273f,0.5882978f,0.5882978f) );

curve.AddKey( new Keyframe(0.5100769f,0.4799553f,float.PositiveInfinity,float.PositiveInfinity) );

curve.AddKey( new Keyframe(0.5973239f,0.2808435f,1.415312f,1.415312f) );

curve.AddKey( new Keyframe(0.8025485f,0.4338613f,2.374947f,2.374947f) );

curve.AddKey( new Keyframe(1f,1f,0f,0f) );

csファイル内にそのまま貼り付けられるテキストになるので、任意のカーブを何かの初期値として使うとかの用途に役立つかもしれません。


使い方

これで上のように変換されたテキストがクリップボードにコピーされますので、自分のC#スクリプトなどで貼り付けします。


中身

using UnityEngine;

#if UNITY_EDITOR

using UnityEditor;

#endif


public class CurveToText : MonoBehaviour

{

    public AnimationCurve curve;

}


#if UNITY_EDITOR

[CustomEditor(typeof(CurveToText))]

public class CurveToTextEditor : Editor

{

    string Convert(float input)

    {

        if (float.IsPositiveInfinity(input)) { return "float.PositiveInfinity"; }

        if (float.IsNegativeInfinity(input)) { return "float.NegativeInfinity"; }

        if (float.IsNaN(input)) { return "float.NaN"; }

        else { return input + "f"; }

    }


    public override void OnInspectorGUI()

    {

        DrawDefaultInspector();

        if (GUILayout.Button("Output to Clipboard"))

        {

            CurveToText t = target as CurveToText;


            string combinedText = "";

            combinedText = "AnimationCurve curve = new AnimationCurve();\n";

            for (int i = 0; i < t.curve.length; i++)

            {

                string time = Convert(t.curve[i].time);

                string value = Convert(t.curve[i].value);

                string inTan = Convert(t.curve[i].inTangent);

                string outTan = Convert(t.curve[i].outTangent);

                combinedText += string.Format("curve.AddKey( new Keyframe({0},{1},{2},{3}) );\n", time, value, inTan, outTan);

            }

            //Copy to Clipboard

            GUIUtility.systemCopyBuffer = combinedText;

        }

    }

}

#endif