Fall animation when character is falling

As far as my controller script is set up. When I press the jump key, the “Jump” animation plays. However, the “FallDown” animation plays immediately after and keeps playing until my character is grounded. I tried some adjustment with my scripts but had no luck.

  1. I want my “Jump” animation to play then clamp on the last frame until I my y velocity is <= 0.
  2. I want my “FallDown” animation to play when I start falling (y velocity < 0).
  3. I’ll add a “Land” animation latter, so I don’t want the “FallDown” animation playing when my character is grounded.

Please feel free to add suggestions/solutions.

Here’s the parts of my scripts that involve the jumping:

	//In air animations
	else
	{
		if(Input.GetButtonDown("Jump"))
		{
			animation.CrossFade("Jump");
			animation["Jump"].speed = 3;
		}
		
		if(!playerController.IsGrounded())
		{
			animation.CrossFade("FallDown", 0.5);
			animation["FallDown"].speed = 3;
		}
	}

(Controller)

//Private, helper variables
private var moveDirection = Vector3.zero;
private var grounded : boolean = true;
private var moveHorz = 0.0;
private var normalHeight = 2.0;
private var crouchHeight = 1.7;
private var rotateDirection = Vector3.zero;

private var isCrouching : boolean = false;
private var isRunning : boolean = false;

//Cache controller so we only have to find it once
var controller : CharacterController;
	controller = GetComponent(CharacterController);
var MoaliaStatus : Moalia_Status;
MoaliaStatus = GetComponent(Moalia_Status);

//Move the controller during the fixed frame updates
function FixedUpdate()
{
	if(!isControllable)
		Input.ResetInputAxes();

	else
	{
		if(grounded)
		{
			//Since we're touching something solid, such as the ground, allow movement
			//Calculate movement directly from input axes
			moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
			moveDirection = transform.TransformDirection(moveDirection);
			moveDirection *= walkSpeed;
			moveDirection.y -= gravity * Time.deltaTime;
			
			//Find rotation based upon axes if need to turn
			moveHorz = Input.GetAxis("Horizontal");
			if (moveHorz > 0)	//Right turn
				rotateDirection = new Vector3(0, 1, 0);
			else if (moveHorz < 0)	//Left turn
				rotateDirection = new Vector3(0, -1, 0);
			else	//not turning
				rotateDirection = new Vector3(0, 0, 0);
			
			//Jump controls	
			if(Input.GetButton("Jump"))
			{
				inair = true;
				if(Input.GetButton("Run") && Input.GetButton("Jump"))
				{
					moveDirection.y = jumpSpeed/2;
				}
				else
				{
					moveDirection.y = jumpSpeed;
				}
			}
			
			//Aplly any boosted speed
			if(Input.GetButton("Run") && Input.GetAxis("Vertical"))
			{
				if(MoaliaStatus.stamina > 0)
				{
					isRunning = true;
					if(MoaliaStatus)
					{
						moveDirection *= runSpeed;
						MoaliaStatus.stamina -= MoaliaStatus.runUsage * Time.deltaTime;
						isRunning = true;
					}
				}
				else if(MoaliaStatus.stamina <= 0)
				{
					isRunning = false;
				}
			}
			
			if(MoaliaStatus)
			{
				if(MoaliaStatus.stamina <= MoaliaStatus.maxStamina)
				{
					MoaliaStatus.stamina += MoaliaStatus.staminaRecharge * Time.deltaTime;
				}
			}
		}

function IsGrounded()
{
	return grounded;
}

Add an extra condition to your if statement for the falling animation. Something like:

        if(!playerController.IsGrounded() && playerController.velocity.y < 0)
        {
            animation.CrossFade("FallDown", 0.5);
            animation["FallDown"].speed = 3;
        }

Check this tutorial. The part with the blend tree might be helpful.

Have a look at this tutorial:

Creating a controllable character

It determines the zenit of the jump and thus you can easily play a falling animation after the character has jumped up in the air and is coming down again.