Help With Animation Play Back - Reverse

Hello,

I’m trying to play an animation back and forth. Let me explain: I have a raycast system that checks to see if the object is over Water (tag), or Other. If the object is over water it needs to play the animation normally, if its over other, then it needs to play the animation in reverse.

The problem is, the animation either doesn’t play at all, or only plays half of it.

Here is my code:

var waterSplash : GameObject;
var waterSplashParticle : ParticleEmitter;
var hydraulics : AudioClip;

private var hit : RaycastHit;

function Awake(){
	waterSplashParticle.particleEmitter.emit = false;
	CheckRaycast();
}

function LateUpdate () {
			
	if(hit.collider.tag == "Water"){
		print("Over Water");
		waterSplashParticle.particleEmitter.emit = true;
		if(playAnim == false){
			FoldInWheels();
			playAnim = true;
		}
	}
	else if(hit.collider.tag == "Other"){
		print("Over Land");
		waterSplashParticle.particleEmitter.emit = false;
		if(playAnim){
			FoldOutWheels();
			playAnim = false;
		}
	}	
	print("Current Land: "+hit.collider.name+" | "+hit.collider.tag);
	
}		
	
private var playAnim : boolean = false;

function FoldOutWheels(){
	animation["packUp"].speed = -1.0;
	animation["packUp"].time = animation["packUp"].length;
	animation.Play("packUp");
	audio.clip = hydraulics;
	audio.Play();	
}

function FoldInWheels(){
	animation["packUp"].speed = 1.0;
	animation.Play("packUp");	
	audio.clip = hydraulics;
	audio.Play();	
}


function CheckRaycast(){
	while(true){
		var direction = transform.TransformDirection (Vector3.up);
		var localOffset = transform.position + transform.up * 2;
		Physics.Raycast (transform.position, -Vector3.up, hit, 500);
		Debug.DrawLine (localOffset, hit.point, Color.blue);
		yield WaitForSeconds(0.2);
	}	
}

Can someone tell me what I am doing wrong? The FoldOutWheels only plays half of the animation, and the FoldInWheels works fine

One thing I noticed right away is that after you fold out the wheels when you go to fold in again your starting at the end of the animation and playing forward, essentially doing nothing.
A simple animation["packUp"].time = 0; to start from the beginning should fix that. As for the only playing half I’m not sure. I’ve had that problem before where animations didn’t complete.

It could be that the animation didnt finish in one frame so setting playAnim = false; stops it. You could try running functions from your animation by adding an event. If your animation is made outside of unity you would have to use this to copy it over:

using UnityEditor;
using UnityEngine;
using System.Collections;

public class CurvesTransferer {

    const string duplicatePostfix = "_copy";

    [MenuItem ("Assets/Transfer Clip Curves to Copy")]
    static void CopyCurvesToDuplicate () {
        // Get selected AnimationClip
        AnimationClip imported = Selection.activeObject as AnimationClip;
        if (imported == null) {
            Debug.Log("Selected object is not an AnimationClip");
            return;
        }
		//EditorUtility.
        // Find path of copy
        string importedPath = AssetDatabase.GetAssetPath(imported);
        string copyPath = importedPath.Substring(0, importedPath.LastIndexOf("/"));
        copyPath += "/" + imported.name + duplicatePostfix + ".anim";

        // Get copy AnimationClip
        AnimationClip copy = AssetDatabase.LoadAssetAtPath(copyPath, typeof(AnimationClip)) as AnimationClip;
        if (copy == null) {
            Debug.Log("No copy found at "+copyPath);
            return;
        }

        // Copy curves from imported to copy
        AnimationClipCurveData[] curveDatas = AnimationUtility.GetAllCurves(imported, true);
        for (int i=0; i<curveDatas.Length; i++) {
            AnimationUtility.SetEditorCurve(
                copy,
                curveDatas*.path,*

curveDatas*.type,*
curveDatas*.propertyName,*
curveDatas*.curve*
);
}

Debug.Log(“Copying curves into “+copy.name+” is done”);
}
}