Dans des circonstances normales, le code que vous avez fourni devrait fonctionner correctement. Cependant, comme indiqué dans les commentaires, il y a une mise en garde - si le Gameobject appelant la coroutine est désactivé/détruit avant que le délai de WaitForSeconds()
soit écoulé, la coroutine sera arrêtée et le code restant ne sera pas appelé du tout. Vous devrez soit attendre que la coroutine se termine avant de détruire le Gameobject, soit avoir un autre Gameobject appeler la coroutine.
Vous avez mentionné que vous cherchiez également des alternatives qui pourraient simplifier votre code - vous pourriez envisager Invoke()
, qui vous permet d'appeler une méthode après un délai spécifié. (Tant que vous n'appelez pas cela très souvent, le surcoût de la réflexion n'aura pas d'effet appréciable sur vos performances.) Ainsi, votre code pourrait être réécrit pour être un peu plus court :
void ActivateBuff1(){
gun.equippedGun.msPerShot /= 2;
gun.equippedGun.shotsLeftInMag += 10;
Invoke("ResetPlayerRage", powerUpDuration);
}
void ActivateBuff2(){
player.speedModifier *= 1.5f;
Invoke("ResetPlayerSpeed", powerUpDuration);
}
void ResetPlayerRage(){
gun.equippedGun.msPerShot *= 2;
}
void ResetPlayerSpeed(){
player.speedModifier /= 1.5f;
}
Malheureusement, Invoke()
sera également annulé si le Gameobject est détruit - mais contrairement à une coroutine, il ne sera pas annulé si le Gameobject est désactivé. Vous pourriez donc d'abord désactiver le Gameobject (pour le rendre invisible et ne pas interagir avec quoi que ce soit), puis le détruire seulement après l'exécution de la méthode retardée :
void ActivateBuff1(){
gun.equippedGun.msPerShot /= 2;
gun.equippedGun.shotsLeftInMag += 10;
gameObject.SetActive(false);
Invoke("ResetPlayerRage", powerUpDuration);
}
void ResetPlayerRage(){
gun.equippedGun.msPerShot *= 2;
Destroy(gameObject);
}
Voici un résumé de savoir si Invoke()
et les coroutines seront arrêtés en fonction de la manipulation du composant de script ou du Gameobject entier :
..........................................................................
: : : :
: Est-ce que ça s'arrête? : InvokeRepeating : Coroutine :
: : : :
:..................................:.....................:...............:
: : : :
: Désactiver le composant de script: Non : Non :
: : : :
:..................................:.....................:...............:
: : : :
: Détruire le composant de script: Oui : Oui :
: : : :
:..................................:.....................:...............:
: : : :
: Désactiver le Gameobject : Non : Oui :
: : : :
:..................................:.....................:...............:
: : : :
: Détruire le Gameobject : Oui : Oui :
: : : :
:..................................:.....................:...............: