Activations & Collisions
DƩtecter les collisions
Savoir dƩtecter les collisions entre objets dans Unity est un outil presque fondamental de tout jeu vidƩo! Comment savoir si tel objet a touchƩ un autre? Comment prƩciser quoi faire lorsque cela arrive?
Nous allons voir comment utiliser les mƩthodes spƩcialement conƧues pour se dƩclencher lors des collisions! OnTrigger_ et OnCollider_!
Il y a trois choses à savoir pour utiliser ces méthodes:
-
La premiĆØre chose Ć savoir cāest quāil faut nĆ©cessairement que les objets possĆØdent tous les deux un colliders pour quāune collision se produise entre les deux! Sans colliders attachĆ© aux objets, les mĆ©thodes ci-dessous ne seront jamais appelĆ©es.
Besoin dāen apprendre plus sur les colliders? Fiche Ressources Physique (Objets et Composants)
Il faut aussi qu’un des 2 objets (en general celui qui bouge le plus et doit dĆ©tecter le plus de collision) possĆØde un rigidbody.
-
Les objets 2D et 3D nāutilisent pas les mĆŖmes composants pour dĆ©tecter les collisions. Il y a donc quelques diffĆ©rences sur lāutilisation des mĆ©thodes ci-dessous. Si tu travailles sur un projet 2D, il te faudra rajouter 2D Ć la suite des expressions Collider et Trigger.
Avec ou sans Trigger?
Un collider ne se comportera pas de la mĆŖme faƧon si il a Ć©tĆ© dĆ©terminĆ© comme Ć©tant un trigger. Un trigger nāest pas vraiment une forme de collision, mais plutĆ“t une zone de dĆ©tection! Un objet avec un trigger se servira de OnTrigger_ tandis quāun objet sans trigger se servira de OnCollider_.
Tu peux en apprendre plus sur lāutilisation du trigger dans la Fiche Ressources Physique (Objets et Composants)
La plupart du temps, on privilƩgiera les triggers pour dƩtecter les contacts entre objets.
Avec Trigger
Vérifie bien que le collider attaché à ton objet est un trigger!
Un trigger est une zone de dĆ©tection! Elle ne rentre pas en collision avec les autres objets et ne sert juste quāĆ repĆ©rer quand un autre collider entre ou sort de la zone! Cāest ce qui nous permet dāutiliser ces mĆ©thodes dans un script attachĆ© Ć notre objet!
private void OnTriggerEnter(Collider other) |
et voilĆ la version pour un projet 2D :Ā
private void OnTriggerEnter2D(Collider2D other) |
La mĆ©thode la plus utilisĆ©e est le OnTriggerEnter! Elle se dĆ©clenche quand un autre objet avec un collider entre dans notre zone de dĆ©tection. Cāest cette mĆ©thode quāon utilisera le plus souvent dans nos projets.
Tu as dĆ» remarquer ce (Collider other) quāon met toujours entre parenthĆØses! Cāest ce quāon appelle un paramĆØtre en programmation, et ici ce paramĆØtre nous permet de rĆ©cupĆ©rer les infos sur lāobjet qui nous a touchĆ©!
Par exemple, si je veux supprimer lāobjet qui vient de nous toucher:
private void OnTriggerEnter(Collider other) |
et la version en 2D :
private void OnTriggerEnter2D(Collider2D other) |
Assez souvent, nous souhaitons vĆ©rifier quāil sāagit bien du bon objet avant de faire quoi que ce soit dessus! En effet, OnTriggerEnter et toutes les autres mĆ©thodes de ce genre vont se dĆ©clencher peut importe lāobjet qui nous a touchĆ©. Pour y remĆ©dier, on peut appliquer une condition, celle qui impose par exemple Ć lāautre objet de porter le tag āJoueurā sinon il ne sera pas dĆ©truit:
private void OnTriggerEnter(Collider other) |
et la version en 2D :
private void OnTriggerEnter2D(Collider2D other) |
Sans Trigger
Il est assez rare quāon essaie de dĆ©tecter une collision entre deux objets sans utiliser de trigger. Cāest quelque chose quāon fait seulement si on tient Ć ce que nos deux objets restent solides!
Ces mĆ©thodes ne fonctionnent que si aucun des deux colliders nāest considĆ©rĆ© comme Ć©tant un trigger.
private void OnCollisionEnter(Collision collision) { |
et la version en 2D :
private void OnCollisionEnter2D(Collision2D collision) { |
Tu remarqueras cette fois que (Collider other) a Ć©tĆ© remplacĆ© par (Collision collision). Ce paramĆØtre permet de rĆ©cupĆ©rer des informations sur la collision entre les deux objets. A moins dāen faire quelque chose dāutile dans notre script, on privilĆ©gie souvent les mĆ©thodes avec trigger!
DƩtruire un objet
Destroy(gameObject);Ā |
Avec cette simple ligne de code tu pourras supprimer lāObjet porteur du Script, dĆ©signĆ© par āgameObjectā. Lāobjet sera supprimĆ© de la mĆ©moire du jeu, on ne pourra plus effectuer dāaction dessus.
On peut Ć©galement donner un temps d’attente avant sa destruction :Ā
Destroy(gameObject, 3);Ā |
Le deuxiĆØme paramĆØtre est le nombre de secondes avant la destruction de lāobjet! Dans lāexemple, lāobjet sera dĆ©truit aprĆØs 3 secondes
DƩsactiver un objet
Si on tu veux dĆ©sactiver un Objet de la ScĆØne qui sera possiblement rĆ©activer plus tard, utilise plutĆ“t :Ā
gameObject.SetActive(false); #pour l’activer remplace (false) par (true)Ā |
DĆ©sactiver un composant de lāobjet
gameObject.GetComponent().enabled = false; #dĆ©sactive le comportement « Mesh RendererĀ Ā» de l’objet porteur du Script |
Comme tu as pu le voir ce nāest pas la mĆŖme commande activer / dĆ©sactiver :
L’objet en entier : SetActive
Un composant sur l’objet : enabled
Ainsi que pour cibler un composant, on commencera par l’Ć©lĆ©ment qui le comprend : Ć savoir le āgameObjectā puis on rentre dedans (en ajoutant un point entre chaque argument) pour arriver Ć l’Ć©lĆ©ment souhaitĆ©. Cāest un peu comme une poupĆ©e Russe.
Si vous avez compris ce principe lĆ , cāest dĆ©jĆ Ć©norme ! Prenez le temps dāexpĆ©rimenter ces lignes de codes !
Cibler un autre objet
Un public ! KEZAKO ??
Alors qu’est-ce que Ƨa ? Et bien cela va nous permettre de cibler un autre GameObject qui ne porte pas le Script.
Pour contenir les informations de la cible, on crée une variable de stockage, en indiquant la nature de la cible à savoir un « GameObject » dans ce cas.
|
public GameObject MonCarreExemple; |
Par convention les dƩclarations des variables sont toujours placer le plus haut dans le script possible, pour les retrouver facilement.
C’est Ć dire juste en dessous du { du titre du Script :
public class MettreIciLeNomDuScript : MonoBehaviour |
Ā
Puis dans la mƩthode Start :
MonCarreExemple.SetActive(false); #dĆ©sactive l’objet cible |
AprĆØs avoir sauvegardĆ© le Script se rendre sur Unity, pour glisser l’objet dans l’Inspector de l’objet porteur du Script.
Le tag (Ʃtiquette)
Lorsque tu codes tes scripts sur Unity, il arrive bien souvent que tu aies besoin dāidentifier un objet! Comment savoir si lāobjet que tu manipules est un joueur, un ennemi ou un projectile? Unity propose une solution trĆØs simple Ć mettre en place: les Ć©tiquettes! (aussi connus sous le nom de tag!)
Assigner un tag
Dans Unity, on peut assigner un tag Ć chaque objet. Par dĆ©faut, un objet nāa pas de tag. On dit alors quāil est untagged (sans Ć©tiquette).
Il suffit de cliquer sur le tag pour choisir lāĆ©tiquette de notre choix dans la liste dĆ©roulante!
CrƩer un nouveau tag
Unity fournit une liste dāĆ©tiquettes prĆ© faites, mais tu peux aussi crĆ©er tes propres Ć©tiquettes! Imaginons par exemple que tu veux faire un tag pour les ennemis, un autre pour les piĆØces, un autre pour les piĆØgesā¦Etc.
Pour crĆ©er sa propre Ć©tiquette, il suffit dāappuyer sur Add Tag⦠en bas de la liste dĆ©roulante
Tu pourras ensuite ajouter ton propre tag dans la liste des tags personnalisƩs en cliquant sur le + (1), en Ʃcrivant le nom de ton nouveau tag (2) et en appuyant sur save (3)
Tu peux ainsi ajouter les tags dont tu auras besoin au fur et Ć mesure que tu codes!
Se servir dāun tag dans le code
Cāest bien beau de faire porter une Ć©tiquette Ć un objet mais Ƨa ne sert pas Ć grand-chose si ce nāest pas pour lāutiliser dans nos scripts! Rappelle-toi, le but est de pouvoir identifier un objet! Pour lire le tag dāun objet, tu peux ajouter .tag Ć la fin de ta variable objet.
Tu peux, par exemple, vĆ©rifier si lāobjet est bien un joueur:
if (objetInconnu.tag==« PlayerĀ Ā») { Ā Ā Ā //Ā c’est donc le joueur Ć qui j’ai assignĆ© ce tag! Ā Ā Ā //Ā ce n’est donc pas le joueur |
Ā
Lāutilisation du tag est extrĆŖmement pratique quand il sāagit de savoir avec quel autre objet notre objet est entrĆ© en collision:
private void OnTriggerEnter(Collider other) |
Cet exemple dĆ©truit lāobjet qui vient dāentrer en collision avec celui-ci mais seulement lorsque lāobjet en question porte le tag āEnnemiā. Sinon il ne fait rien!
Instancier / Faire ApparaƮtre Un Objet
Pour instancier un nouvel objet on utilise la fonction Instantiate :
Voici une petite vidĆ©o qui tāexplique cela en dĆ©tail
