How to reset all animation clips?
Hello,
I am working on a Unity project that involves playing an animation in segmented steps. It simply demonstrates the correct order to disassemble a piece of equipment called a rear plate.
My .FBX file is imported into Unity from 3D Studio Max, and in the Animation tab of the import inspector, I set the 10 animation clips based on the corresponding frames. Eg:
"Remove Mounting Screws" Start frame: 0, End frame: 10 "Remove Retainer Ring" Start frame: 11, End frame: 20 etc.
On the Rig tab of the import inspector, I set the Animation Type to "Legacy" (because of my script, I was getting an error telling me to set it to legacy rather than Generic).
In my script, I have a "next step" button, which plays the next animation clip, a "replay" button that simply replays the current animation clip, and I want to have a "reset" button that resets all the animation clips to their starting frame. This seems like it should be the most simple part, but I can not figure out how to rest all the clips to their start position, using a loop. I can only seem to get the last played animation clip to reset to start.
Here is my code (I have removed some unnecessary stuff that would display a progress bar and text ):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Controller : MonoBehaviour {
private int totalSteps= 10;
private GameObject rearPlate;
private Animation anim;
private ArrayList clipList;
public int stepIndex;
private float animTime;
private float animLength;
void Start () {
//adds event handlers for all my buttons
EventHandler.add (GameObject.Find ("btnNext"), "onButtonClick", playNext);
EventHandler.add (GameObject.Find ("btnReplay"), "onButtonClick", playReplay);
EventHandler.add (GameObject.Find ("btnReset"), "onButtonClick", onReset);
rearPlate = GameObject.Find ("rearPlate");
anim = rearPlate.GetComponent<Animation> ();
clipList = new ArrayList ();
stepIndex = 0;
//creates an array containing the names of my 10 animation clips
foreach(AnimationState state in anim){
clipList.Add (state.name);
}
}
// Update is called once per frame
void Update () {
}
public void playNext(BaseEvent evt){
if (stepIndex < stepCount) {
if (stepIndex == 0) {
stepIndex++;
anim.Play ((string)clipList [stepIndex - 1]);
} else {
if (anim [(string)clipList [stepIndex - 1]].time != 0f && anim [(string)clipList [stepIndex - 1]].time < anim [(string)clipList [stepIndex - 1]].length) {
return;
} else {
stepIndex++;
anim.Play ((string)clipList [stepIndex - 1]);
}
}
}
}
public void playReplay(BaseEvent evt){
if (stepIndex != 0) {
anim.Play ((string)clipList [stepIndex - 1]);
}
}
public void onReset(BaseEvent evt){
for (int i = 0; i < stepIndex; i++) {
anim.Play ((string)clipList [i]);
anim [(string)clipList [i]].time = 0.0f;
anim [(string)clipList [i]].speed = 0.0f;
}
stepIndex = 0;
}
}
My onReset function at the end is where i need to place some sort of code that will reset all the animation clips. As of right now, I had tried a work-around way, but it does not work correctly. It only resets the most recently played animation clip.
I would think there would be some sort of easy way to say:
anim["nameOfAnimationClip"].frame = 0;
Any help would be appreciated. Maybe I need to be going about this in a different way, by using the Generic Animation Type, and using an Animator component, and a Controller?
Thanks, Mike