Déclencheurs dans Unity, Canons et Colonnes

Il était demandé d’avoir des déclencheurs dans Unity avec des cannons et un colonne qui tombe. Comme d’habitude, j’ai voulu tout recréer de A à Z.

Voici la colonne :

et le cannon

Les déclencheurs dans Unity et la colonne.

Le code pour exécuter les déclencheurs dans Unity est assez simple mais il y a une petite subtilité. En fait quand on passe sur le zone de déclanchement, on veut activer différents objets qui auront chaqu’un des réactions uniques. Mais on ne sera pas le nom des scripts. Par exemple, on aura la colonne qui va s’effondrer. Mais on aura aussi le canon qui va tirer. Comment on peut appeler un script sans savoir son nom, ni la fonction publique à appeler.

Simplement en créant des Interfaces :

https://unity3d.com/fr/learn/tutorials/topics/scripting/interfaces

On va créer nos scripts en temps qu’interface d’une classe parent qui aura la définition de la fonction a exécuter.

Voici le fichier TriggerableObject :

Et notre script pour détruire la colonne.

Pour faire bref sur la colonne et comment elle se casse, J’ai tout simplement deux prefabs. Un avec la colonne en entier, et la deuxième avec la colonne en plusieurs morceaux. Je détruis la colonne complète et je la remplace par les morceaux avec un instantiate. Le moteur physique fait le reste du boulot …. (Et j’ai un déclencheur si on appuie sur le bouton “r” pour les tests…)

Sinon, pour le déclanchement, il faut surtout noter la déclaration de la classe : public class DestroyColonne : MonoBehaviour, TriggerableObject.

On utilise MonoBehaviour ET notre tout nouveau TriggerableObject. Ceci nous OBLIGE à avoir une fonction runTrigger() comme défini dans notre fichier interface. Cela permet surtout de récupérer les scripts de type “TriggerableObject” et exécuter la fonction runTrigger :

Ceux qui est intéressant ici est qu’on propose une liste d’objets peuvent être déclenchés grâce à “public List<GameObject> triggerObjects;”

Ensuite, au déclenchement par le joueur, on récupère le script de type triggerObjects sur chaque élément et on exécute la fonction runTrigger();

Petit bonus, on exécute un “void OnDrawGizmosSelected()” sur chaque élément. Ceci permet d’afficher les lignes vertes entre le déclencheur et les objets dans la vue création d’Unity.

Et pour le canon ?

Un peu le même principe sauf que l’objet est un peu plus complexe.

On a un Transform pour l’endroit où les boulets de canon vont apparaitre, un GameObject pour les boulets de canon (qui sont en Prefab). Il y a également un Animator qui gère un petit animation lorsque le canon tire. Des particules pour faire l’effet de fumée et diverses variables pour la vitesse de tire, le délai entre les tirs et la durée de vie des boulets de canon (on ne veut pas 10.000 éléments qui trainent dans notre environnement).

Un élément important est le bool isShooting qui va gérer si le canon est en train de tirer ou pas. On ne veut pas plusieurs déclanchements en même temps.

Lors du déclanchement du trigger, on exécute la coRoutine fireSequance(). Ceci permet de tirer plusieurs coups à une vitesse définie.

Tout le code du tir se trouve fans le fonction shoot(). On Instantiate le boulet de canon et on émet la fumée. Tout le reste se passe sur le boulet de canon directement. Que nous virons dans un prochain poste.

On retrouve notamment cette ligne très importante :

StartCoroutine(firedBall.GetComponent<CanonBall>().destroyBallAfterTime(canonBallLifetime));

qui appel la CoRoutine dans le script du boulet qu’on retrouve ici

Leave a Reply

Your email address will not be published. Required fields are marked *