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")