2017-05-31 1 views
0

Tout d'abord, je suis assez novice en matière de script, il y aura probablement quelques failles dans mon script. Donc, j'ai créé un script pour la mise sous tension, mais une fois que mon tir ou le joueur touche la pièce de mise sous tension, le taux de feu augmente, mais il ne revient pas au taux de tir normal après 5 secondes ... Je n'ai aucune idée de ce qui pourrait être la cause, tout conseil serait utile!La mise sous tension de l'unité ne fonctionne pas comme prévu

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

en double possible de [Je ne sais pas comment utiliser coroutines dans Unity3D] (https://stackoverflow.com/questions/40792548/do- non-savoir-comment-utiliser-coroutines-dans-unity3d) – Serlite

+0

Merci, je sais ce que le problème est maintenant! – Nick

Répondre

0

IEumerator est certainement l'une des façons de résoudre ce problème. Cependant, je ne suis pas fan d'eux, voici ma solution si vous avez une minuterie dans le jeu.

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. 
} 

De cette façon, lorsque vous avez obtenu la mise sous tension, vous pouvez définir gotPowerUp = timePassed. Vous avez donc l'heure exacte à laquelle la mise sous tension est activée.

alors vous faites quelque chose comme

if((gotPowerUp + 5) == timePassed){ 
//5 seconds have passed. 
//deactivate powerup here 
} 
1

Je pense que le problème ici est que vous détruire le gameobject ce script est attaché à (la pièce) et ce faisant, le script lui-même est détruit, par conséquent, son code, coroutine ou autre ne s'exécutera pas.

 StartCoroutine(PowerUpTime()); 
     isPowerUp = true; 
     Destroy(gameObject); //oops, our script has been destroyed :(

Vous devrez faire ceci très différemment, en déplaçant fondamentalement l'essentiel du code vers la classe PlayerShoot.

Quelque chose comme ça (ce dans 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

Oui, j'ai remarqué ... j'aurais dû vérifier mon code un peu plus mais merci pour la réponse! – Nick