2017-05-31 101 views
0

首先,我对脚本编程很陌生,所以我的脚本中可能会出现一些缺陷。联合开机无法正常工作

所以基本上我已经写了一个加电的脚本,但是一旦我的镜头或者玩家触碰了加电硬币,火速会增加,但是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

的可能的复制[不知道如何在Unity3D使用协同程序(https://stackoverflow.com/questions/40792548/do- not-know-how-to-use-coroutines-in-unity3d) – Serlite

+0

谢谢,我知道现在的问题是什么! – Nick

回答

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 
} 
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; 
} 
+0

是的,我注意到...我应该检查我的代码多一点,但谢谢你的答复! – Nick