"Walk" animation playing instead for "Run"

When I hold the “Vertical” key (w), the “Walk” animation clip plays. However, when I hold the “Run” key too, the “Walk” animation clip plays instead of the “Run” animation clip. So what’s wrong/missing in my scripts?

Controller (JavaScript):

//Moalia's movement variables
//These can be changed in the Inspector
var walkSpeed = 2.0;
var runSpeed = 4.0;
var jumpSpeed = 6.0;
var gravity = 9.0;
var rotateSpeed = 4.0;
var crouchSpeed = 0.5;

var isControllable : boolean = true;

//Private, helper variables
private var moveDirection = Vector3.zero;
private var grounded : boolean = false;
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"))
			{
				if(Input.GetButton("Run") && Input.GetButton("Jump"))
				{
					moveDirection.y = jumpSpeed/3;
				}
				else
				{
					moveDirection.y = jumpSpeed;
				}
			}
		
			//Aplly any boosted speed
			if(Input.GetButton("Run") && Input.GetAxis("Vertical"))
			{
				isRunning = true;
				if(MoaliaStatus)
				{
					moveDirection *= runSpeed;
					MoaliaStatus.stamina -= MoaliaStatus.runUsage * Time.deltaTime;
					isRunning = true;
				}
			}
			
			isRunning = false;
			if(MoaliaStatus)
			{
				if(MoaliaStatus.stamina <= MoaliaStatus.maxStamina)
				{
					MoaliaStatus.stamina += MoaliaStatus.staminaRecharge * Time.deltaTime;
					isRunning = false;
				}
			}
		}
	
		//Crouch the controller
		if(Input.GetButton("Crouch"))
		{
			controller.height = crouchHeight;
			controller.center.y = controller.height/2;
			moveDirection *= crouchSpeed;
			isCrouching = true;
		}
		
		if(Input.GetButtonUp("Crouch"))
		{
			//Reset height and center after ducks
			controller.height = normalHeight;
			controller.center.y = controller.height/2;
			isCrouching = false;
		}
		
		if(Input.GetButtonUp("Run"))
		{
			isRunning = false;
		}
		
		//Apply gravity to end jump, enable falling, and make sure he's touching the ground
		moveDirection.y -=gravity * Time.deltaTime;
		
		//Move and rotate the controller
		var flags = controller.Move(moveDirection * Time.deltaTime);
		controller.transform.Rotate(rotateDirection * Time.deltaTime, rotateSpeed);
		grounded = ((flags & CollisionFlags.CollidedBelow) != 0);
	}
}

//----------------------------------------------------
function IsMoving()
{
	return moveDirection.magnitude > 0.5;
}

function IsRunning()
{
	return isRunning;
}

function IsCrouching()
{
	return isCrouching;
}

function IsGrounded()
{
	return grounded;
}

//Make the script easy to find
@script AddComponentMenu("Moalia/MoaliaCharacterControler")

Animation (JavaScript):

private var nextPlayIdle = 0.0;
var waitTime = 10.0;
var playerController: Moalia_Controller;
playerController = GetComponent(Moalia_Controller);

private var moveDirection = Vector3.zero;

function Start()
{
	//Set up layers - high numbers recieve priority when blending
	animation["Idle"].layer = 0;
	//We want to make sure that the (animations) are synced together
	animation["Walk"].layer = 1;
	animation["Run"].layer = 1;
	animation["Crouch"].layer = 1;
	animation.SyncLayer(1);
	animation["Jump"].layer =5;
	//These should take priority over all others
	animation["Crouch"].wrapMode = WrapMode.Loop;
	animation["Jump"].wrapMode = WrapMode.ClampForever;
	
	//Make sure nothing is playing by accident, then start with a default idle.
	animation.Stop();
	animation.Play("Idle");
}

function Update() 
{
	//On  the ground animations
	if(playerController.IsGrounded())
	{
		animation.Blend("Jump", 0, 0.2);
		animation["Jump"].speed = 2;
		//If Running
		if(playerController.IsRunning())
		{
			animation.CrossFade("Run", 0.5);
			animation["Run"].speed = 6.4;
			nextPlayIdle = Time.time + waitTime;
		}
		else if(playerController.IsCrouching())
		{
			animation.CrossFade("Crouch", 0.2);
			nextPlayIdle = Time.time + waitTime;
		}
		//Fade in Walk
		else if(playerController.IsMoving())
		{
			animation.CrossFade("Walk", 0.5);
			animation["Walk"].speed = 3.2;
			nextPlayIdle = Time.time + waitTime;
		}
		//Fade out walk and run else
		else
		{
			animation.Blend("Run", 0.0, 0.3);
			animation.Blend("Walk", 0.0, 0.3);
			animation.Blend("Crouch", 0.0, 0.3);
			if(Time.time > nextPlayIdle)
			{
				nextPlayIdle = Time.time + waitTime;
				PlayIdle();
			}
		}	
	}
	//In air animations
	else
	{
		if(Input.GetButtonDown("Jump"))
		{
		animation.CrossFade("Jump");
		animation["Jump"].speed = 2;
		}
	}
	
	//Test for idle
	if(Input.anyKey)
	{
		if(moveDirection.magnitude < 0.1)
		{
			animation.CrossFade("Idle");
		}
	}
}

function PlayIdle()
{
	animation.CrossFade("Idle", 0.2);
}

@script AddComponentMenu("Player/Moalia'AnimationManager")

Looks to me like line 79 of your Controller is immediately setting isRunning to false, even after it could have been set true by the if statement on line 68.

Instead, try removing the isRunning = false; statement at line 79, and instead put it up at line 66, above the if statement that tests for running.

Fixed Script:

//Moalia's movement variables
//These can be changed in the Inspector
var walkSpeed = 2.0;
var runSpeed = 4.0;
var jumpSpeed = 6.0;
var gravity = 9.0;
var rotateSpeed = 4.0;
var crouchSpeed = 0.5;

var isControllable : boolean = true;

//Private, helper variables
private var moveDirection = Vector3.zero;
private var grounded : boolean = false;
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"))
			{
				if(Input.GetButton("Run") && Input.GetButton("Jump"))
				{
					moveDirection.y = jumpSpeed/3;
				}
				else
				{
					moveDirection.y = jumpSpeed;
				}
			}
			//Aplly any boosted speed
			if(Input.GetButton("Run") && Input.GetAxis("Vertical"))
			{
				isRunning = true;
				if(MoaliaStatus)
				{
					moveDirection *= runSpeed;
					MoaliaStatus.stamina -= MoaliaStatus.runUsage * Time.deltaTime;
					isRunning = true;
				}
			}
			
			if(MoaliaStatus)
			{
				if(MoaliaStatus.stamina <= MoaliaStatus.maxStamina)
				{
					MoaliaStatus.stamina += MoaliaStatus.staminaRecharge * Time.deltaTime;
				}
			}
		}
	
		//Crouch the controller
		if(Input.GetButton("Crouch"))
		{
			controller.height = crouchHeight;
			controller.center.y = controller.height/2;
			moveDirection *= crouchSpeed;
			isCrouching = true;
		}
		
		if(Input.GetButtonUp("Crouch"))
		{
			//Reset height and center after ducks
			controller.height = normalHeight;
			controller.center.y = controller.height/2;
			isCrouching = false;
		}
		
		if(Input.GetButtonUp("Run"))
		{
			isRunning = false;
		}
		
		//Apply gravity to end jump, enable falling, and make sure he's touching the ground
		moveDirection.y -=gravity * Time.deltaTime;
		
		//Move and rotate the controller
		var flags = controller.Move(moveDirection * Time.deltaTime);
		controller.transform.Rotate(rotateDirection * Time.deltaTime, rotateSpeed);
		grounded = ((flags & CollisionFlags.CollidedBelow) != 0);
	}
}

//----------------------------------------------------
function IsMoving()
{
	return moveDirection.magnitude > 0.5;
}

function IsRunning()
{
	return isRunning;
}

function IsCrouching()
{
	return isCrouching;
}

function IsGrounded()
{
	return grounded;
}

//Make the script easy to find
@script AddComponentMenu("Moalia/MoaliaCharacterControler")