Les déclencheurs (ou triggers)

Dans ce tuto, nous allons exploiter le système de "zones de déclencheurs" afin d'activer des animations du décors. Sur le même principe, nous verrons qu'il aussi possible d'activer / désactiver des objets.

 

Ce qu'il faut comprendre, c'est qu'une fois qu'on mis en place un déclencheur, il va pouvoir nous servir à tout un tas de choses ! Tout ce que l'on veut !

 

Placer une zone déclencheur dans Unity consiste à créer un Empty composé d'un Collider configuré en Trigger (déclencheur).

Un script doit être attaché à l'empty afin qu'il réagisse lorsqu'il détecte quelque chose.

L'idée :

 

- Lorsque le collider 1 repère le joueur, il rend visible la plateforme à sa gauche, jusque-là invisible. Ceci permettant au joueur d'accéder au collider 2....

 

- Lorsque le collider 2 est touché par le joueur, celui-ci active l'animation de la plateforme à sa gauche, jusque-là immobile et inatteignable.

 

- Les colliders sont bien évidemment invisibles au joueur.

1. Faire apparaître un objet lorsque le joueur atteind une zone donnée

Mise en place de la scène (setup)

Voici le type d'arborescence que l'on va devoir créer :

Remarquez ici l'utilisation d'un Empty qui nous servira de conteneur globale de notre système.

Il contiendra la plateforme elle-même, en l’occurrence, un simple cube redimensionné et le système de repérage du joueur indépendant de la plateforme (au même niveau dans la hiérarchie).

 

Procédez comme suit :

  1. Créez un Empty
  2. Mettez-le à zéro
  3. Renommez-le "Contener"
  4. Clique-droit dans la hierarchie sur le Contener -> 3D Object -> Cube. L'avantage de faire cela est qu'il est automatiquement à zéro.
  5. Renommez-le "Plateforme". Ceci est la plateforme qui sera cachée tant que le joueur n'aura pas activé son déclencheur.
  6. Transformez-le afin de lui donner la forme souhaitée (mais attention, évitez les déplacements !).
  7. Si vous souhaitez déplacer votre système, sélectionnez plutôt dans la hiérarchie le "Contener", et appliquez-lui les translations désirées.
  8. Création du déclencheur : Clic droit sur Contener -> Create Empty
  9. Renommez-le "Trigger" ou " TriggerZone", ou "Déclencheur". Ceci sera la zone de déclenchement.
  10. Ajoutez-y un collider (box ou sphere, peu importe)
  11. Cochez la case IsTrigger !! On veut en effet que le joueur puisse passer à travers sans cogner sur quelque chose d'invisible.
  12. Puis "Edit Collider" et redimensionnez le collider comme souhaité.

Et voilà, avec tout cela en place, notre base est prête !

Mise en place des interactions (programmation)

Analysons ce qu'il doit concrètement se passer :

  1. Pour le moment, notre plateforme est visible. Donc, 1ère chose : faire disparaître la plateforme
  2. Le collider doit surveiller le joueur.
  3. Si le joueur est repéré : faire apparaître la plateforme ! (Et le tour est joué).

Ceci sous-entend que le gameobject qui est équipé du collider doit "être intelligent" : c'est lui qui va surveiller et repérer le joueur ; et c'est aussi lui qui fera réapparaître la plateforme. C'est donc lui qui doit s'occuper de la faire disparaître.

Conclusion : le gameobject déclencheur doit adopter certains comportements. Il doit donc être équipé d'un script.

 

 

Identifions ce dont on va avoir besoin, en termes de fonctions Unity.

  • Premièrement : faire apparaître et disparaître un gameObject (la fonction principale de notre script)

Nous allons avoir besoin de la fonction GameObject.SetActive.

Voici le lien vers la documentation de Unity.

1
2
3
4
5
//Activer un gameObject
gameObject.SetActive(true);

//Désactiver un gameObject
gameObject.SetActive(false);

Ce qui sous-entend que le script doit connaître le gameObject à activer/désactiver : nécessité d'une variable pointant vers notre plateforme.

  • Deuxièmement : surveiller le contact du joueur avec la zone de déclenchement (ça, on s'en est déjà servi plusieurs fois)

Nous allons avoir besoin de la fonction Collider.OnTriggerEnter(Collider)

Voici le lien vers la documentation de Unity.

1
2
3
4
5
void OnTriggerEnter ( Collider col )
{
        //Si le collider touché est celui du joueur
        //Faire apparaître la plateforme
}

Voilà, vous avez tous les outils pour éditer le script de gestion de la plateforme ! :)

Je vous invite à vous y essayer sans aller plus loin. Et seulement si vraiment vous n'y arrivez pas, à regarder la suite.


Voici ce qu'il doit se passer dans le script :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
void Start ()
{
        //Faire disparaître la plateforme
}

void OnTriggerEnter ( Collider col )
{
        //Si le collider touché est celui du joueur
        //Faire apparaître la plateforme
}

Remarquez qu'il n'y a pas besoin de grand chose, en fin de compte ^^

 

 

Allez, voyons ensemble :

  1. Créez un script C# dans votre projet, nommez-le par exemple "DeclencheurObjetCache".
  2. Attachez ce script à votre gameObject équipé du collider de repérage du joueur.
  3. Ouvrez votre script pour l'éditer.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
using UnityEngine;

public class HiddenObject : MonoBehaviour
{
        public GameObject plateforme;                            //Référence à la plateforme


        void Start ()
        {
                plateforme.SetActive ( false );                  //Désactivation de la plateforme
        }

        void OnTriggerEnter ( Collider col )
        {
                //Si le tag du gameObject du collider touché est égale à "Player"
                if ( col.tag == "Player" )
                {
                        plateforme.SetActive ( true );      //Activation de la plateforme
                }
        }
}

Remarque : J'utilise ici le tag "Player" pour repérer si c'est bien l'objet du joueur qui entre en contact.

 

Nous pourrions aussi utiliser le nom du gameObject :

1
2
//Si le nom du gameObject du collider touché est égale à "NomDuGameObjectPlayer"
if ( col.name == "NomDuGameObjectPlayer" )

2. Déclencher une animation

Maintenant que l'on a vu comment déclencher l'apparition d'un GameObject, quel qu'il soit, nous sommes en mesure de déclencher tout ce que l'on veut !

 

En effet, le principe restera toujours le même :

  • Une zone collider paramétrée en trigger
  • Celle-ci surveille la présence du joueur (ou autre)
  • Lorsque le joueur (ou autre) entre en contact, déclencher ce que l'on veut.

Mais... c'est ce petit "ce que l'on veut" qui risque de parfois poser problème. En effet, c'est là qu'il s'agit de connaître Unity, et d'une, pour savoir ce qu'il est possible de faire, et de deux, comment le faire.

 

Dites-vous déjà que quasiment tout ce que vous pouvez faire à la souris dans l'interface de Unity et faisable par le code.

Ex : Activer / Désactiver un GameObject (case à cocher de l'inspecteur).

 

Il s'agit après de connaître le code à utiliser pour le faire.

Dans l'exemple précédent : GameObject.SetActive()

 

 

Pour déclencher une animation par le code, la fonction à utiliser sera celle-ci :

Animation.Play()

Voici la documentation.

 

 

Il faut savoir qu'en exécutant cette fonction tel-quel, le composant Animation lira le clip placé par défaut (entouré en rouge).

Notez que la case "Play Automatically" est décochée. En effet, nous ne voulons pas que l'animation se déclenche automatiquement puisque nous la déclencher seulement si le joueur entre dans la zone déterminée.

En reprenant le même genre de setup que le précédent ; plutôt que de faire apparaître un objet préalablement caché, vous allez pouvoir exécuter l'animation de n'importe quel gameObject en créant un script comme celui-ci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
//Ce script est à attacher sur le GameObject doté d'un collider
//faisant office de déclencheur

using UnityEngine;

public class AnimatedObject : MonoBehaviour
{
        public Animation animComponent;                          //Référence au composant Animation de la plateforme animée


        //Lorsque le collider entre en contact avec quelque chose
        void OnTriggerEnter ( Collider col )
        {
                //Si le tag de l'objet contacté est égal à "Player"
                if ( col.tag == "Player" )
                {
                        animComponent.Play ();                          //Exécuter le clip d'animation placé par défaut.
                }
        }
}