Change capsule size on key GetDown
Hi I am making an endless running game and I'm close to finishing it but I'm stuck at one bit of changing the size of the capsule. Here's my code so far.
Vector3 SCenter;
Vector3 Ncenter;
GameObject SetText;
GameObject MoneyText;
AudioSource BGaudio;
// Use this for initialization
void Start()
{
HighScore = PlayerPrefs.GetInt("HighScore");
CoinScore = PlayerPrefs.GetInt("CoinScore");
animator = GetComponent<Animator>();
CC = GetComponent<CapsuleCollider>();
BGaudio = GetComponent<AudioSource>();
void Update() { if (count > HighScore) { PlayerPrefs.SetInt("HighScore", count); PlayerPrefs.Save(); }
PlayerPrefs.SetInt("CoinScore", CoinCount);
PlayerPrefs.Save();
if (Input.GetKey(KeyCode.Space))
{
animator.SetBool("Running_Jump", true);
}
else
{
animator.SetBool("Running_Jump", false);
}
if (Input.GetKeyDown(KeyCode.DownArrow))
{
animator.SetBool("Running_Slide", true);
CC.center = SCenter;
CC.radius = 0.18f;
CC.height = 1.82f;
CC.direction = 2;
}
else
{
animator.SetBool("Running_Slide", false);
CC.center = Ncenter;
CC.radius = 0.2f;
CC.height = 1.79f;
CC.direction = 1;
}
}
What I want to do is everytime the player presses the DownaArrow key the capsule size changes and it plays the sliding animation but otherwise keep it normal and not play the animation. The thing is the code works but when I press downarrow the capsule size changes but quickly change back to normal. I know why this is doing this because it is in the function Update(). But I tried to use yield and waitforseconds. It doesn't do anything.. Here's the code
IEnumerator Slide()
{
animator.SetBool("Running_Slide", true);
CC.center = SCenter;
CC.radius = 0.18f;
CC.height = 1.82f;
CC.direction = 2;
yield return new WaitForSeconds(2f);
}
Any ideas??
Answer by _Game_Dev_Dude_ · Nov 18, 2015 at 10:06 AM
The bug is this. You are checking for GetKeyDown in your update loop. This will only return true for the frame that you press a given key, every frame after that it will be false until you release the key and press it again. You have a couple of options depending on the gameplay you want.
if you are going to hold the down arrow key for the duration of the slide, then you can change your getkeydown line to just GetKey.
It looks like you are using time as a factor and you want to press down, slide for 2 seconds, then come back up.
In this case what you need to do is wrap your if/else statement in another if that checks if you are currently sliding with a bool or something. Then when you press down, set that bool to whatever it should be. Something like this.
if(!currentlySliding)
if (Input.GetKeyDown(KeyCode.DownArrow))
{
animator.SetBool("Running_Slide", true);
CC.center = SCenter;
CC.radius = 0.18f;
CC.height = 1.82f;
CC.direction = 2;
currentlySliding = true;
}
else
{
animator.SetBool("Running_Slide", false);
CC.center = Ncenter;
CC.radius = 0.2f;
CC.height = 1.79f;
CC.direction = 1;
}
}