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 trois 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. 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.

  3. 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