Activations & Collisions

Dans cette page tu trouveras :

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 deux choses à savoir pour utiliser ces méthodes:

  1. 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)

  2. 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)
{
// code à déclencher quand un objet ENTRE dans la zone de détection
}

private void OnTriggerStay(Collider other)
{
  // code à déclencher quand un objet RESTE dans la zone de détection
}

private void OnTriggerExit(Collider other)
{
// code à déclencher quand un objet QUITTE dans la zone de détection
}

et voilà la version pour un projet 2D : 

private void OnTriggerEnter2D(Collider2D other)
{
// code à déclencher quand un objet ENTRE dans la zone de détection
}

private void OnTriggerStay2D(Collider2D other)
{
  // code à déclencher quand un objet RESTE dans la zone de détection
}

private void OnTriggerExit2D(Collider2D other)
{
// code à déclencher quand un objet QUITTE dans la zone de détection
}

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)
{
    Destroy(other.gameObject);
}

et la version en 2D :

private void OnTriggerEnter2D(Collider2D other)
{
    Destroy(other.gameObject);
}

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)
{
    if(other.tag==« Joueur »){
      Destroy(other.gameObject);
    }
}

et la version en 2D :

private void OnTriggerEnter2D(Collider2D other)
{
    if(other.tag==« Joueur »){
      Destroy(other.gameObject);
    }
}

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)

{
    // code à déclencher quand un autre objet RENTRE en collision avec celui-ci
}

private void OnCollisionStay(Collision collision)
{
    // code à déclencher quand un autre objet RESTE en collision avec celui-ci
}

private void OnCollisionExit(Collision collision)
{
    // code à déclencher quand un autre objet QUITTE sa collision avec celui-ci
}

et la version en 2D :

private void OnCollisionEnter2D(Collision2D collision)

{
    // code à déclencher quand un autre objet RENTRE en collision avec celui-ci
}

private void OnCollisionStay2D(Collision2D collision)
{
    // code à déclencher quand un autre objet RESTE en collision avec celui-ci
}

private void OnCollisionExit2D(Collision2D collision)
{
    // code à déclencher quand un autre objet QUITTE sa collision avec celui-ci
}

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

La fonction pour accéder à un composant se nomme GetComponent()
 

gameObject.GetComponent().enabled = false; #désactive le comportement « Mesh Renderer » de l’objet porteur du Script

gameObject.GetComponent().material.color = Color.red; #change la couleur du Matérial qui est dans le 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 ») {
  //  l’objet porte bien le tag ‘Player’

   //  c’est donc le joueur à qui j’ai assigné ce tag!
} else {
  //  l’objet ne porte pas le tag ‘Player’

   //  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)
{
    if(other.tag==« Ennemi »)
    {
        Destroy(other.gameObject);
    }
}

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

Passer au Niveau suivant (changer de Scène)

Retour en haut