x


Using AnimationCurve in List. or Builtin Arrays

Hi everyone, I have this little trouble, using the AnimationCurve in builtin arrays don't keep the modified values, if I try to retrieve the values of any curve the result are like if I put this(AnimationCurve.Linear(0,0,1,1)) every time, my question is: How can I keep those values even if I change from one scene to another?, I ask this because I'm trying to use a multiple animation curve to manipulate some values over time using the "CustomEditor" to make an Editor Tool.

The idea is to use something like this:

var theCurve : AnimationCurve[]= new AnimationCurve[5];

for (i = 0; i < theCurve.length; i ++) {
    theCurve[i] = EditorGUILayout.CurveField("Some Name", theCurve[i]);
}

Any help will be very appreciated.

Thanks a lot to eveyone who can help me.

more ▼

asked Aug 05 '11 at 09:17 PM

3D-Magic-VR gravatar image

3D-Magic-VR
41 12 14 15

(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

Hi every one, I found a solution very interesting about this, the solution is:

// This will be "Main Script".
var animationContainer = new List.<AnimationParameters>();
var howManyAnimations = int;

function Update () {
    if (howManyAnimations > animationContainer)
        animationContainer.Add(AnimationParameters);
}


// This will be "AnimationParameters" script.

class AnimationParameters {
    var curveAnim : AnimationCurve;
}

This way you can use multiple animation curves and every curve keeps the values without loosing them if you change from one scene to another.

You can check this to see how it's applied. ;-)

more ▼

answered Sep 01 '11 at 10:25 PM

3D-Magic-VR gravatar image

3D-Magic-VR
41 12 14 15

(comments are locked)
10|3000 characters needed characters left

Where is "theCurve" declared? On a script attached to a GameObject? In this case make sure you don't override the array somewhere. You should use the Reset function to initialise the array. Reset is only called once when the script instance is attached or when you rightclick the component and select "Reset".

If you declared the array in a custom editor / inspector class that wouldn't be a good idea. This class instances are recreated everytime it is reopened. These classes aren't meant for saving static data. Save them to an asset that is serialized.

Some more information what you're actually trying to accomplish would help.
Do you create a custom inspector for a script of yours or a general EditorWindow like the animation window? Where is the data stored?

edit

Ok since Unity can't save AnimationCurves you have to use an AnimationClip that holds the curves.

Normally when assigning AnimationCurves to an AnimationClip you have to specify a relative transform path, a component and a property that is animated by this animation curve. I just want to store the curves and don't care about the clip itself. To be able to store multiple clips i just used the array index as path-string.. xD

function OnInspectorGUI()
{
    if (Target.test == null)
    {
        Debug.Log("Created Clip");
        Target.test = new AnimationClip();
    }
    var curves = AnimationUtility.GetAllCurves(Target.test);
    var CC = new AnimationCurve[5];
    for (i = 0; i < curves.length; i ++)
    {
        CC[i] = curves[i].curve;
    }

    for (i = 0; i < CC.length; i ++)
    {
        if (CC[i] == null)
        {
            Debug.Log("Created curve");
            CC[i] = AnimationCurve.Linear(0,0,1,1);
        }
        CC[i] = EditorGUILayout.CurveField("Some Name", CC[i]);
        Target.test.SetCurve("Name"+i,Transform,"",CC[i]);
    }
}

You should read the manual to understand AnimationUtility.GetAllCurves and SetCurves

It's not really nice but the only alternative is to save the keyframe data "manually" with types that are serializable.

more ▼

answered Aug 05 '11 at 10:31 PM

Bunny83 gravatar image

Bunny83
45.5k 11 49 207

Thanks for the reply, the situation is this:

The variable is in the game object, I made a function to set the size of the array, then use this stuffs in an editor script, all draw fine even the curve can be modified, but when I open another scene and return to where the script is, there just re-initialized, the changes are gone. There's some way to keep the values?, thanks again for your answer.

Aug 05 '11 at 10:43 PM 3D-Magic-VR

The values should be automatically serialized / deserialized. Where and when do you initialize the array?

Aug 05 '11 at 11:01 PM Bunny83

Well, i've actually tested it myself and unfortunately Unity can't serialize AnimationCurves.

On this page they listed all serializable types:
http://unity3d.com/support/documentation/ScriptReference/SerializeField.html

Aug 05 '11 at 11:21 PM Bunny83

Finally i've got it working. Unity can't directly save AnimationCurves, only AnimationClips are serialized. It's just a quick and dirty test, but it works ;)

I will edit my answer

Aug 05 '11 at 11:45 PM Bunny83

Thanks for your help, I'll try it, it's not exactly what I want but hopes works fine to me, even if I find some other way to do that I´ll share it.

Aug 07 '11 at 05:54 PM 3D-Magic-VR
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x356
x356
x57

asked: Aug 05 '11 at 09:17 PM

Seen: 1449 times

Last Updated: Nov 11 '11 at 10:57 PM