Вы можете использовать сопрограммы. Каждый раз, когда вы включаете питание, вы отменяете уже существующую сопрограмму (если она существует) и запускаете новую, которая будет обрабатывать время. Вот как это было бы сделано на моем пути:
public PlayerMovement movement;
public GameObject PowerUp;
public float jumpUpForce = 5000f;
public float jumpBackForce = 1000f;
public Rigidbody rb;
bool doWeHaveJumpPowerUp;
Coroutine cor;
public float timer;
// Use this for initialization
void Start()
{
doWeHaveJumpPowerUp = false;
timer = 10.0f;
}
void OnCollisionEnter(Collision collisionInfo)
{
if (collisionInfo.collider.tag == "Obstacle")
movement.enabled = false;
if (collisionInfo.collider.tag == "PowerUp")
{
PowerUp.SetActive(false);
if(cor != null)
{
StopCoroutine(cor);
cor = null;
}
cor = StartCoroutine(JumpPower());
}
}
IEnumerator JumpPower()
{
doWeHaveJumpPowerUp = true;
yield return new WaitForSeconds(timer);
doWeHaveJumpPowerUp = false;
}
// Update is called once per frame
void Update()
{
if (doWeHaveJumpPowerUp)
if (transform.position.y < 2)
if (Input.GetKey("left shift"))
rb.AddForce(0, jumpUpForce * Time.deltaTime, -jumpBackForce * Time.deltaTime);
}
РЕДАКТИРОВАТЬ: если вы хотите больше типов бонусов, вот как вы хотите добавить их:
public PlayerMovement movement;
public GameObject PowerUp;
public float jumpUpForce = 5000f;
public float jumpBackForce = 1000f;
public Rigidbody rb;
bool doWeHaveJumpPowerUp;
Coroutine cor;
public float timer;
// 2nd power up
bool doWeHaveFlyPowerUp;
// Use this for initialization
void Start()
{
doWeHaveJumpPowerUp = false;
timer = 10.0f;
}
void OnCollisionEnter(Collision collisionInfo)
{
if (collisionInfo.collider.tag == "Obstacle")
movement.enabled = false;
if (collisionInfo.collider.tag == "PowerUpJump")
{
PowerUp.SetActive(false);
if (cor != null)
{
StopCoroutine(cor);
cor = null;
}
cor = StartCoroutine(JumpPower());
}
if (collisionInfo.collider.tag == "PowerUpFly")
{
PowerUp.SetActive(false);
if (cor != null)
{
StopCoroutine(cor);
cor = null;
}
cor = StartCoroutine(FlyPower());
}
}
IEnumerator JumpPower()
{
doWeHaveJumpPowerUp = true;
yield return new WaitForSeconds(timer);
doWeHaveJumpPowerUp = false;
}
IEnumerator FlyPower()
{
doWeHaveFlyPowerUp = true;
yield return new WaitForSeconds(timer);
doWeHaveFlyPowerUp = false;
}
// Update is called once per frame
void Update()
{
if (doWeHaveJumpPowerUp)
if (transform.position.y < 2)
if (Input.GetKey("left shift"))
rb.AddForce(0, jumpUpForce * Time.deltaTime, -jumpBackForce * Time.deltaTime);
if (doWeHaveFlyPowerUp)
{
//Fly power up logic
}
}
В обоих примерах включения питания отменяют уже существующее включение. Вы должны спланировать, как вы хотите, чтобы бонусы работали:
- если персонаж сможет получить много бонусов одновременно.
- Если вновь включенное питание того же типа, что у вас уже есть, увеличило продолжительность или обновило его.
Кроме того, в этот момент вы сможете иметь только одно включение. Если вы хотите больше, вы должны написать для них генератор (если вы хотите, чтобы они были случайными) или поместить их вручную, если вы хотите, чтобы они были в некотором порядке.