- Home /
Check for input in a non-Update() function?
So basically, I have a script that spawns a particle explosion, stops the player and hides the player model every time the player dies, and the player is able to restart the level by pressing enter.
Here are the relevant parts of the code:
void OnTriggerEnter (Collider other) {
//Player collides with an enemy
if (other.gameObject.tag == "Enemy") {
PlayerDeath ();
}
}
//Check if player is falling off the map
void Update () {
if (transform.position.y <= -10) {
PlayerDeath ();
}
}
//When the player dies
void PlayerDeath () {
if (DeathLoop == true) {
Instantiate (deathParticles, transform.position, Quaternion.identity);
renderer.material.color = new Color (0.196f, 0.33f, 0.67f, 0);
DeathLoop = false;
manager.PlayerDie ();
Pause ();
}
if (Input.GetKey (KeyCode.Return)) {
transform.position = spawn;
manager.ClearText ();
Play ();
renderer.material.color = new Color (0.196f, 0.33f, 0.67f, 1f);
DeathLoop = true;
}
}
The problem is when the player dies when colliding with an "enemy" tagged object, since the PlayerDeath() function is called but only takes input the moment it is executed, and so the player cannot restart the level unless they hold down enter as they die. So is there a way to make it check for the enter key being pressed as often as Update() does?
P.S. Sorry for the lengthy post but there's a lot of code that's relevant to the problem.
Answer by highpockets · Mar 03, 2014 at 09:57 PM
Yes, use a Coroutine:
void PlayerDeath()
{
StartCoroutine( MyCoroutine());
//your other code...
}
iEnumerator MyCoroutine()
{
bool inRoutine = true;
while( inRoutine )
{
if( input.GetKey (KeyCode.Return))
{
inRoutine = false;
//your other code..
}
yield return new WaitForEndOfFrame();
}
}
Use yield return null
, not yield return new WaitForEndOfFrame()
.
Your answer
