首先,我对脚本非常陌生,所以我的脚本可能会有一些缺陷。
所以基本上,我已经制作了一个用于加电的脚本,但是一旦我的射击或玩家触及加电硬币,火速就会增加,但是在5秒后它不会恢复到正常的火速。 ..我不知道可能是什么原因,任何建议都会有所帮助!
using UnityEngine;
using System.Collections;
public class FireRatePowerUp : MonoBehaviour {
private bool isPowerUp = false;
private float powerUpTime = 5.0f;
private PlayerShoot playerShoot;
private void Start()
{
playerShoot = PlayerShoot.FindObjectOfType<PlayerShoot>();
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "Player" || collision.gameObject.tag == "Projectile")
{
StartCoroutine(PowerUpTime());
isPowerUp = true;
Destroy(gameObject);
if (collision.gameObject.tag == "Projectile")
{
Destroy(collision.gameObject);
}
}
}
IEnumerator PowerUpTime()
{
playerShoot.fireRate -= 0.13f;
yield return new WaitForSeconds(powerUpTime);
playerShoot.fireRate += 0.13f;
}
}
答案 0 :(得分:1)
我认为这里的问题是你要摧毁这个脚本所附带的游戏对象(硬币),这样做,脚本本身就会被破坏,因此代码,协程或其他他们不会执行。
StartCoroutine(PowerUpTime());
isPowerUp = true;
Destroy(gameObject); //oops, our script has been destroyed :(
您必须以非常不同的方式执行此操作,基本上将大部分代码移动到PlayerShoot类。
像这样(这是在PlayerShoot.cs中)
public void ActivatePowerupFireRate(float time, float amt) {
StartCoroutine(DoActivatePowerupFireRate(time, amt));
}
public IEnumerator ActivatePowerupFireRate(float time, float amt) {
fireRate -= amt;
yield return WaitForSeconds(time);
fireRate += amt;
}
答案 1 :(得分:0)
IEumerator绝对是解决此问题的方法之一。 但是,如果你在比赛中有计时器,那么我不是他们的粉丝。
public int timePassed = 0;
public int gotPowerUp = 0;
void Start(){
InvokeRepeating("Timer", 0f, 1.0f);
//Starting at 0 seconds, every second call Timer function.
}
void Timer(){
timePassed++; // +1 second.
}
当你获得通电时,可以设置gotPowerUp = timePassed。因此,您可以获得启动启动的确切时间。
然后你做了类似的事情if( (gotPowerUp + 5) == timePassed ){
//5 seconds have passed.
//deactivate powerup here
}