I created a basic powerup that will double my speed when I go over it. Now I would like to make the speed only last for ‘X’ number of seconds and for that PowerUp to not be active for ‘Y’ number of seconds. How should I go about doing this?
Coroutines are enumerators that can be started by a MonoBehaviour, and are executed separately by the engine, on a frame-by-frame basis. A very convenient feature is the ability of Coroutines to suspend execution for a given amount of time, which is hands down the best way to deal with bonus duration and bonus cooldown.
So what you need to do is :
Lock the power up when it is activated
Increase speed
Wait for X seconds
Reset speed
Wait for Y seconds
Unlock the powerup
using UnityEngine;
using System.Collections;
public class Player : MonoBehaviour
{
float m_Speed = 10f;
float m_DefaultSpeedBonus = 10f;
float m_DefaultPowerUpDuration = 5f;
float m_DefaultPowerUpCooldown = 10f;
bool m_PowerUpIsActivable = true;
IEnumerator SpeedPowerUp(float bonus, float bonusDuration, float cooldown)
{
// Lock the PowerUp
m_PowerUpIsActivable = false;
// Activate the speed bonus
m_Speed += bonus;
// Let it last for bonusDuration seconds
yield return new WaitForSeconds(bonusDuration);
// Remove the speed bonus
m_Speed -= bonus;
// Start cooldown
yield return new WaitForSeconds(cooldown);
// After cooldown is over, unlock the PowerUp
m_PowerUpIsActivable = true;
}
void OnTriggerEnter(Collider collider)
{
if (collider.CompareTag("PowerUp") && m_PowerUpIsActivable)
{
StartCoroutine(SpeedPowerUp(m_DefaultSpeedBonus, m_DefaultPowerUpDuration, m_DefaultPowerUpCooldown));
}
}
}
You can apply the same logic to any PowerUp you want to implement.