Ecole Informatique Grenoble » Tutoriel Unity n°5 : Les collisions et les triggers
Plan du site  
français  English
pixel

Blog du campus SUPINFO Grenoble

Tutoriel Unity n°5 : Les collisions et les triggers

Publié le 26 juin 2017 dans Actualités

Bonjour à toutes et à tous! Précédemment, nous avons découvert les scripts ainsi que ses propriétés. Aujourd’hui, pour le dernier tutoriel de la série, nous allons découvrir les collisions « basic » mais aussi des collisions plus complexe grâce aux scripts ainsi que les triggers.

 

Trigger

 

Un trigger qu’est-ce que c’est ? C’est tout simplement lorsqu’un GameObject en détecte un autre grâce aux propriétés « colliders » sur les GameObjects. Pour illustrer ceci, effacez nos deux cubes crées dans le précédent tutoriel pour avoir une scène avec juste notre caméra. Créez ensuite un cube en 0,0,0. Regardez l’inspector de ce cube et cochez la propriété « Is Trigger » du conponent « box collider ». Ensuite créez une sphère en 0,3,0. Modifiez le scale en 0.5,0.5,0.5 et ajoutez lui un Rigidbody. Lancez votre application. La sphère traverse le cube. Vu que votre cube est en Trigger, il détecte si un GameObject passe sur lui. Il y a 3 types de détections :

  • Enter : Lorsque notre GameObject en détecte un autre en rentrant. (détection via le collider)
  • Stay : Lorsque notre GameObject en détecte un autre à l’intérieur de lui-même
  • Exit : Lorsque notre GameObject en détecte un autre en sortant (détection via le collider)

Pour le moment, on ne le remarque pas mais nous allons réaliser des scripts pour mieux le comprendre.

            Enter

 

Nous allons donc tester d’abord lorsque notre Sphère tombe, si elle va détecter le cube lorsqu’il va la toucher. Pour cela, créez un script TestTrigger. Vous avez donc les deux fonctions de bases, start et update. Pour détecter notre trigger, il existe déjà une méthode qui s’appelle OnTriggerEnter et qui possède un paramètre qui est le collider du GameObject qui sera détecté. Ce script sera sur la sphère pour détecter le cube qui est en trigger.

Voici un script simple de trigger :

Et voici le résultat en lançant notre application.

Lorsque notre sphère rentre dans notre cube, notre message s’affiche bien. Enlevez le script de la sphère pour illustrer un autre type.

            Exit

 

Nous allons donc maintenant tester le trigger exit, donc lorsque notre Sphère sort du cube. Pour cela créez un script TriggerExit. Vous avez donc les deux fonctions de bases start et update. Pour détecter notre trigger, il existe déjà une méthode qui s’appelle OnTriggerExit et qui possède justement un paramètre qui est le collider du GameObject qui sera détecté. Ce script sera sur la sphère pour détecter le cube qui est en trigger.

Voici un script simple de trigger :

Voici le résultat en lançant l’application :

Lorsque notre sphère sort du cube, notre message s’affiche bien. Enlevez ce script de notre sphère pour illustrer le dernier type.

            Stay

Nous allons maintenant tester lorsque notre Sphère est dans le cube. Pour cela créez un script TriggerStay. Vous avez donc les deux fonctions de bases start et update. Pour détecter notre trigger, il existe déjà une méthode qui s’appelle OnTriggerStay et qui possède justement un paramètre qui est le collider du GameObject qui sera détecté. Ce script sera sur la sphère pour détecter le cube qui est en trigger.

Voici un script simple de trigger :

Voici le résultat :

Conclusion sur les triggers

 

Grâce au trigger, on peut faire énormément de choses, comme par exemple des pièges. Avec ces trois types, on peut réellement traiter tous les cas. Par exemple, notre personnage rentre dans une salle, on le détecte via OnTriggerEnter. Lorsqu’il est à l’intérieur, il y a différents évenements déclenchés grâce à OnTriggerStay et ces évènements sont désactivés lorsqu’il est en dehors. Enfin, lorsqu’il sort, on désactive ces évènements.

Nous allons maintenant voir. Effacez tous les GameObjects à part la caméra.

Collision

 

            Collision « basic »

 

Avant de vous donner une définition de la collision, nous allons vous montrer un exemple. Créez un cube (qui se nomme terrain) en position 0,2,0 avec un scale en x de 20 et en y de 5. Mettez lui un RigidBody avec la propriété « Is Kinematic ». Ensuite, créez un autre cube (qui se nomme personnage) en position 0,3,0 qui aura un Rigidbody. Lorsqu’on lance l’application, notre personnage est stoppé dans sa chute comme on l’a vu dans un précédent article. Ce qu’il se passe c’est qu’il y a détection de collision implicite via le RigidBody. La collision est comme le trigger avec un détail supplémentaire : la physique. Il possède également les 3 types vus lors des triggers. Pour que la collision fonctionne, il faut absolument un RigidBody sur nos GameObjects qui seront en collisions.

 

            Script de déplacement

 

Avant de continuer, nous allons réalisé un script de déplacement lorsqu’on appuie sur une touche. C’est exactement la même chose lorsqu’on a vu notre premier script à un détail. On doit vérifier la touche qu’on appuie. Mettez ce script sur le personnage. (N’oubliez pas de mettre des valeurs à saut et à speed dans l’éditeur Unity via l’inspector sur le cube)

Notre cube bouge bien.

            Enter

 

Nous allons illustrer donc illustrer la collision. Placez un autre cube (obstacle) en position 4,2,0 avec un Rigidbody en Kinematic. Voici le script quand on rentre en collision :

Ce script est sur notre personnage. Quand notre personnage rentre en collision avec le GameObject obstacle, on écrit notre message. Lancez votre application et observez qu’il est marqué.

            Exit

Ceci sert quand on sort de notre collision. On le fait grâce à OnCollisionExit

Quand votre personnage rentre en collision, Un message s’affichera et quand il sort, un autre s’affichera également.

Tag vs name

 

Dans nos méthodes de collision (et également pour les trigger), on vérifie le nom du GameObject. Il y a plus puissant que cela : le tag.

Un tag sert à faire un regroupement de GameObject. L’avantage majeur est que si, par exemple, vous avez 100 GameObjects et que lorsque votre personnage rentre en collision avec l’un d’eux vous faites un traitement. Si ce traitement est le même pour les 100 GameObjects et si vous utilisez dans la condition le « name », il faut alors le faire 100 fois pour chaque GameObject. Par contre avec le tag, une seule fois suffit.

Créez un autre cube (obstacle 2) en -4,2,0 avec un RigidBody en Kinematic. Puis modifiez vos méthodes comme ceci :

En utilisant le name dans nos conditions pour chaque méthode, nous avons traité chaque GameObject mais ils font le même traitement (affichage). Le tag va factoriser cela en une seule et unique condition. Sur Unity, il faut d’abord créer ce tag.

Sélectionnez votre GameObject, puis dans l’inspector cliquez sur « untagged ». Une liste de tag existe de base mais nous allons en créer une nouvelle. Cette fenêtre apparait :

Cliquer sur le « + » pour en ajouter un. Nommez le « obstacle ». Retournez sur l’inspector des deux GameObject obstacle puis sélectionnez le tag « obstacle » qui a dû apparaitre.  Vous devriez avoir cela pour nos deux obstacles:

Maintenant, commentez le contenu des deux méthodes de collisions et ajoutez ceci dans chaque méthode avec un message différent :

Observez et rentrez en collision avec les deux obstacles pour vérifier le bon fonctionnement.

 

Conclusion

Les triggers servent donc à faire de la détection entre nos GameObject. Les collisions, quant à elle, servent à faire également de la détection mais physique entre nos GameObjects (si un ennemi nous touche par exemple). Le tag sert à faire un regroupement de GameObject pour que dans notre code nous n’ayons qu’un seul traitement pour cette catégorie de GameObject. Le name sert à faire un traitement spécifique à un GameObject. Rien n’empêche d’utiliser les deux. C’est-à-dire par exemple, ici, le tag faisait de l’affichage. Nous aurions aussi pu utiliser le name d’un de des obstacles et modifier sa position. Du coup, un obstacle ferait de l’affichage alors que l’autre ferait aussi de l’affichage mais sa position est également changée.

Problèmes sur les collisions

Il existe cependant un gros problème dans les collisions. Lorsque notre personnage touche le cube, cela effectue la méthode de collision. Par contre, si nous souhaitons exécuter cette méthode sur une seule partie duGameObject (ici, c’est un cube donc une face), cela est impossible en laissant la méthode telle qu’on l’a faite. La collision s’effectue sur l’intégralité du cube et non sur une face. On va donc utiliser un nouvel objet pour faire cela : le Raycasthit.

 

L’article de la semaine prochaine portera sur les GameObjects.

 

Bon développement!

Rencontrez SUPINFO Grenoble

Rencontrez-nous à l'occasion des Journées Portes-Ouvertes (JPO) organisées dans l'ensemble des campus SUPINFO en France et dans le monde.

Rencontrez SUPINFO Grenoble

Contactez SUPINFO Grenoble

Vous avez besoin d'informations complémentaires sur l'établissement ? Vous désirez parler à une conseillère d'orientation ou obtenir une adresse régionale ?

Contactez SUPINFO Grenoble
A propos de SUPINFO | Contacts & adresses | Conditions d'utilisation & Copyright | Respect de la vie privée
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels