Play animation once (when down key pressed) in c#
I have a roll animation created for an endless run/side-scroller I'm making, and it plays when I press the down key. However it only continues to play if I keep that key pressed. I want it to play through the entire animation when I press the down key and not have to keep it key pressed in order to do so.
Since I have the loop option unchecked on the animation (so it will only play once—otherwise infinite continuous rolls are possible) if you keep the down key pressed after the animation is complete, the character will keep gliding along, not running, but on the last frame of the roll sequence, which I don't want to be possible. Hopefully with a different method of signaling the animation's end, this will not be an issue.
Here's the code I have so far: (Note - I am using the bool "maybeDown" to see if the down key is pressed.)
using UnityEngine;
using System.Collections;
public class PlayerController : MonoBehaviour {
public float moveSpeed;
public float jumpForce;
private Rigidbody2D myRigidbody;
public bool grounded;
public LayerMask whatIsGround;
public bool maybeDown;
private Collider2D myCollider;
private Animator myAnimator;
// Use this for initialization
void Start () {
myRigidbody = GetComponent<Rigidbody2D>();
myCollider = GetComponent<Collider2D>();
myAnimator = GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
if(Input.GetKeyDown(KeyCode.DownArrow))
{
maybeDown = true;
}
if (Input.GetKeyUp(KeyCode.DownArrow))
{
maybeDown = false;
}
grounded = Physics2D.IsTouchingLayers(myCollider, whatIsGround);
myRigidbody.velocity = new Vector2(moveSpeed, myRigidbody.velocity.y);
if(Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W))
{
if(grounded)
{
myRigidbody.velocity = new Vector2(myRigidbody.velocity.x, jumpForce);
}
}
myAnimator.SetFloat ("Speed", myRigidbody.velocity.x);
myAnimator.SetBool ("Grounded", grounded);
myAnimator.SetBool ("DownKey", maybeDown);
}
}
Does anyone have a fix? I know it's being caused because the animation is set to stop on a keyUp, but I'm not sure how else to set the bool back to false without causing other problems.
Answer by SoniaJB · Mar 30, 2016 at 12:23 AM
Nevermind, I found a fix! I deleted myAnimator.SetBool ("DownKey", maybeDown);
from my code and changed if(Input.GetKeyDown(KeyCode.DownArrow)) { maybeDown = true; } if (Input.GetKeyUp(KeyCode.DownArrow)) { maybeDown = false; }
to this: if(Input.GetKeyDown(KeyCode.DownArrow)) { myAnimator.Play("Player_Roll"); }
And I removed the conditions in my Animator from the paths going between my Run and Roll animations. Now it works perfectly!