我实际上不推荐在这里Update
中使用计时器,因为它妨碍了您至少已经停用相应的GameObject
。 Corotuine 也是如此。
在两种情况下,您都无法Destroy
或SetActive(false)
的PowerUp项困扰我。
但是您可以使用Invoke
!
如果对象被销毁,它仍然会破坏,但是它可以在无效的GameObject上运行!
因此,请先禁用它,然后Destroy
。
更多点:
所以您的代码可能看起来像
public int jumpBonus = 0;
public int speedBonus = 0;
public int healthBonus = 0;
public float duration = 0;
private PlayerMove playerMove;
private Health playerHealth;
private void OnTriggerEnter2D(Collider2D coli)
{
if (!coli.CompareTag("Player")) return;
playerMove = coli.gameObject.GetComponent<PlayerMove>();
playerHealth = coli.gameObject.GetComponent<Health>();
playerMove.jumpForce += jumpBonus;
playerMove.speed += speedBonus;
playerHealth.health += healthBonus;
gameObject.SetActive(false);
// Calls ResetEffect after "duration" seconds even if gameObject is inactive
Invoke(nameof(ResetEffect),duration);
}
private void ResetEffect()
{
playerMove.jumpForce -= jumpBonus;
playerMove.speed -= speedBonus;
playerHealth.health -= healthBonus;
Destroy(gameObject);
}
,
您可以使用Update和DeltaTime来执行单个计时器,以在所需时间的浮动范围内工作。
public float powerTime = 0.0f
private bool poweredUp = false;
void OnTriggerEnter2D(Collider2D coli)
{
if (coli.gameObject.tag == "Player")
{
powerTime = 10.0f;
}
}
Update()
{
powerTime -= Time.deltaTime;
if (powerTime > 0.0f && !poweredUp)
{
poweredUp = true;
doPowerUp();
}
else if (poweredUp)
{
doPowerEnd()
}
void doPowerUp()
{
coli.gameObject.GetComponent<PlayerMove>().jumpForce += jumpTrig;
coli.gameObject.GetComponent<PlayerMove>().speed += speed;
coli.gameObject.GetComponent<Health>().health += health;
}
void doPowerEnd()
{
poweredUp = false;
Destroy(this.gameObject);
//reset to your normal values.
}
本文链接:https://www.f2er.com/3137087.html