Dernière mise à jour le 10 mars 2025 par LMD
Nous allons aborder différents aspects de la création d’un jeu simple, appelé « RGB, The Color Game ».
Bien qu’au final, nous devrions créer un jeu cohérent en plusieurs niveaux, nous scinderons l’étude en plusieurs fichiers distincts.
1. Installer le nouvel Input System
Cette section est obsolète.
Depuis la version 2019 d’Unity, il existe un nouvel Input System pour gérer les événements utilisateur. Plus puissant et plus universel, il n’est cependant pas activé par défaut. Il est nécessaire au bon fonctionnement des personnages des Starter Assets mais il rend obsolète de nombreux scripts d’interactions utilisateur disponibles sur de nombreux tutos internet, à commencer par ceux vus à la page précédente pour faire avancer un objet avec les flèches du clavier, si vous utilisez un FPS ou un TPS.
Allez dans Menu Window > Package Manager.
Dans la fenêtre qui s’ouvre, ci-dessous, choisissez en haut à gauche Package > Unity Registry.
Après quelques secondes, la liste s’affiche dans la colonne de gauche. Cliquez sur Input System, puis sur le bouton Install en bas à droite.
Une alerte vous prévient que vous allez remplacer l’ancien système.
Cliquez sur le bouton Yes.
Unity va redémarrer et l’ancien système sera désactivé.
Il y a ensuite plusieurs moyens de vérifier que le nouvel Input System est bien installé.
1_ Allez dans le Menu Assets > Create.
Tout en bas de ce Menu très long, il doit y avoir la ligne Input Actions.
2_ Allez dans le Menu Edit > Project Settings et cliquez sur Player dans la colonne de gauche.
Dans la catégorie Configuration, la propriété Active Input Handling doit afficher Input System Package (New).
Dans la version 2022, ce paramètre est réglé par défaut sur Both.
À l’inverse, si besoin, pour désactiver le nouvel Input System :
– ouvrez le Package Manager, sélectionnez Input System et cliquez sur le bouton Remove en bas à droite,
– Dans les Player Settings, choisissez Input Manager (Old) pour la Propriété Active Input Handling (voir ci-dessus).
2. User Interface
Dans un jeu, les éléments d’interface sont courants : pour créer un Menu de démarrage, pour afficher un panneau de Réussite, pour ajouter des Boutons ou des Scores à l’espace de jeu. Ces éléments sont généralement des objets 2D plaqués sur l’écran du jeu. Ils peuvent aussi être intégrés à l’espace du jeu, mais c’est plus difficile.
Créez un nouveau Fichier 3D.
Tous les éléments d’interface UI (User Interface) sont disponibles par un Clic Droit > UI dans la Hierarchy.
À voir ci-contre. Le plus important est le Canvas, rectangle aux dimensions de la fenêtre du jeu, sur lequel sont placés les éléments d’interface, textes, images, sliders, panneaux, etc.
• Placer le Canvas
Commencez par ajouter un Canvas. Ci-dessous, sur la Scene à gauche en 3D, le Canvas se voit à peine sous forme d’un trait blanc fin.
Cliquez sur le Bouton 2D en haut à droite de la fenêtre Scene et sélectionnez le Canvas dans la Hierarchy. Sur l’écran à droite, le Canvas se devine comme un cadre blanc très fin, mais pas entier.
Zoomez en arrière et déplacez le Canvas au centre (avec l’outil Main), comme sur l’écran ci-dessous. Ou plus rapide, Double Cliquez sur le Canvas dans la Hierarchy.
Des poignées bleues s’affichent lorsqu’il est sélectionné. L’outil Rect Tool est actif (voir Les bases d’Unity) mais ne permet pas de modifier les dimensions du Canvas.

Le Canvas a par défaut une dimension qui dépend de la fenêtre Game, dimension visible dans le Component Rect Transform.
Il peut s’adapter à différentes résolutions d’écran grâce au Component Canvas Scaler.
Il n’est pas possible de modifier ses dimensions avec le Rect Tool.
La dimension de la fenêtre Game peut être ajustée. Activez la fenêtre Game. Cliquez sur le Menu Free Aspect et choisissez une dimension. En mode Free Aspect, vous pouvez ajuster la fenêtre manuellement avec des poignées sur chaque côté.
La dimension choisie est reportée dans le Component Rect Transform du Canvas. Revenez sur la Scene.
• Adapter l’EventSystem
Cette Section est obsolète
Sélectionnez l’EventSystem dans la Hierarchy. Dans l’Inspector, le Component Standalone Input affiche un avertissement. Il faut adapter l’EventSystem au nouvel Input System activé au début de cette page.
Cliquez sur le bouton Replace with InputSystemUIInputModule.
Ci-dessous, à droite, le Component Standalone est alors remplacé par un Component Input System UI.
• Ajouter un Panel
Par Clic Droit > UI dans la Hierarchy, ajoutez ensuite un Panel, qui va devenir automatiquement Enfant du Canvas (Si vous placez directement un Panel ou un autre UI Object, cela crée automatiquement un Canvas comme Parent).
Ce Panel a les mêmes dimensions que celles du Canvas; il servira de fond. Vous pouvez si besoin changer sa couleur dans l’Inspector.
Vous pouvez aussi placer une image d’arrière plan sur ce Panel. Il faut la préparer dans Photoshop à la même dimension, puis la faire glisser dans un dossier approprié des Assets (dossier Images par exemple). Il faut la convertir en Sprite pour pouvoir vous en servir ainsi. Ce peut être une image JPG ou PNG.

Sélectionnez l’image dans les Assets. Dans l’Inspector, dans le Menu Texture Type, choisissez Sprite (2D and UI). Réglez Sprite Mode sur Single.
Validez en cliquant sur le bouton Apply.
Dans un jeu en 2D, les images doivent également être converties en Sprite.
Sélectionnez le Panel. Dans l’Inspector, au Component Image, faites glisser le Sprite dans la zone Source Image. Ajustez si besoin la transparence de la Color en cliquant sur le rectangle de la couleur. Si la Color n’est pas blanche, elle va colorer votre image.


• Préparer des fontes
Avant de rajouter des textes sur le Canvas, il faut rajouter des Fonts dans les Assets et les préparer afin qu’elles soient reconnues correctement. Vous pouvez utiliser un fichier ttf ou mieux otf.
Créez un dossier Fonts dans les Assets et faites-y glisser vos fontes.
Allez dans le Menu Window > TextMeshPro > Font Asset Creator. C’est l’outil qui va vous permettre de convertir les fontes au format Text Mesh Pro.
Quand vous lancez cet outil pour la première fois, il faut installer des ressources supplémentaires. Dans la fenêtre qui s’ouvre, ci-dessous, cliquez sur le bouton Import TMP Essentials. Inutile de cliquer sur le bouton Import TMP Example & Extras et fermer cette fenêtre.
Un dossier TextMesh Pro est ajouté dans les Assets.
L’activation de TextMeshPro aurait pu se faire manuellement à partir de Package Manager.
La fenêtre ci-dessous apparait. À la première ligne, cliquez sur le cercle à droite du réglage Source Font File et dans le panneau qui s’ouvre, choisissez une fonte à convertir. Seules les fontes présentes dans les Assets sont reconnues.
Ci-dessous, j’ai choisi la fonte « Game Commands » qu apparait dans la première ligne. Le bouton Generate Font Atlas devient actif. Cliquez dessus. Cela remplit la zone inférieure de la fenêtre.
Cliquez sur le bouton Save. Enregistrez bien dans le dossier Font des Assets.
Les fontes converties apparaissent alors dans les Assets, avec une icône bleue et la lettre F en bleu, voir ci-dessous.
Faites de même pour toutes les fontes nécessaires.
• Placer du texte
Nous allons écrire le nom du jeu (RGB) avec des éléments Texte.
Sélectionnez cet Objet Text dans la Hierarchy et faites les réglages dans l’Inspector :
– dans la zone de saisie du texte, tapez R en majuscule,
– dans Font Asset, choisissez une des fonte générée plus haut,
– réglez la Font Size (100) et la Vertex Color (rouge),
– Réglez l’Alignment, centré dans les deux sens.
Réglez ensuite, ci-dessous, la dimension de la zone de texte et gardez sa position à 0.
Recommencez avec les lettres G et B, avec les mêmes réglages mais en les colorant respectivement en vert et bleu.
Vous pouvez rajouter de la même manière une base-line, de type « THE COLOR GAME » comme nouveau texte.
• Rajouter des boutons
Ci-contre, à gauche, l’Inspector du Button.
Le Component Rect Transform permet de régler sa dimension et sa position, ainsi que son alignement, voir ci-dessous.

Dans le Component Image, on choisit la Color de fond.
Dans le Component Button, on peut régler ses différents aspects, au survol et au clic.
Vous pouvez lancer le Game pour tester l’aspect des boutons (changement au survol). Si cela ne fonctionne pas, vérifiez que vous avez bien basculé l’EventSystem dans le nouvel Input System (cf plus haut).
• Ajouter des Scripts aux boutons
Dans les Assets, ajoutez un dossier nommé « Scripts ». Créez à l’intérieur deux nouveaux Scripts C#, l’un nommé « Bouton_Play » et l’autre « Bouton_Quit ».
Double-cliquez sur un Script pour ouvrir le code et le modifier.
Script pour le Bouton QUIT :
Dans ce Script, j’ai désactivé la ligne qui permet de quitter le jeu car elle ne fonctionnera que dans le vrai jeu exporté. Pour tester le fonctionnement du bouton, j’ai rajouté la ligne Debug.Log qui permet d’afficher un message dans la Fenêtre Console (à afficher à côté de Project par Menu Window > General > Console)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Bouton_Quit : MonoBehaviour {
private Button bouton_quit;
// Start is called before the first frame update
void Start() {
bouton_quit = GetComponent<Button>();
bouton_quit.onClick.AddListener(QuitGame);
}
// Fonction pour quitter le programme
private void QuitGame() {
//Application.Quit();
Debug.Log("Bouton Quit cliqué");
}
}
Script pour le Bouton PLAY :
Pour tous les Scripts d’éléments d’interface, il faut rajouter la ligne de chargement des éléments d’interface UnityEngine.UI
Il faut également charger le SceneManagement pour permettre au bouton Play de provoquer le changement de Scene.
On crée une variable pour stocker le bouton : bouton_play. Dans le void Start, on initialise la variable en lui associant le bon Button. Puis on lui ajoute ce qu’on appelle un écouteur d’événement (Listener). Il va servir à activer la fonction void PlayGame lorsqu’on clique sur le bouton (c’est l’événement « écouté »).
La fonction PlayGame charge la Scene suivante, ici la 1.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Bouton_Play : MonoBehaviour {
private Button bouton_play;
// Start is called before the first frame update
void Start() {
bouton_play = GetComponent<Button>();
bouton_play.onClick.AddListener(PlayGame);
}
// Update is called once per frame
private void PlayGame() {
SceneManager.LoadScene(1);
}
}
Il reste à créer une nouvelle Scene, nommée « Level1 » par un Clic Droit > Create > Scene dans le dossier Assets / Scenes.
Il faut également déclarer les Scenes dans le jeu. Menu File > Build Profiles (ignorez au cas où le message sur le chargement de xcrun).
Depuis les Assets > Scenes, faites glisser les deux Scenes dans la zone Build Settings, et fermez juste la fenêtre.
Appliquez les Scripts à leurs boutons respectifs. Sélectionnez le Button Play dans la Hierarchy. Faites glisser le Script Bouton_Play depuis les Assets sur l’Inspector du Bouton. Cela rajoute un Component Script.
Lancez le jeu pour tester.
Lorsque vous cliquez sur le bouton Quit, vous devez voir un message dans la Console et sur le bouton Play, cela doit afficher la Scene Level1 (vide pour l’instant).
• Interface par dessus le jeu
Pour afficher un score, un bouton pour recommencer le niveau, un message de réussite, ou autre, il faut créer une interface 2D qui va se superposer à l’écran du jeu.
Il faut donc commencer par rajouter un Canvas dans une Scene par un Clic Droit dans la Hierarchy : UI > Canvas. Puis vous ajouterez les champs nécessaires.
Double Cliquez sur la Scene « Level1 » pour l’activer et placez-y un Cube aplati et agrandi pour en faire un « Sol » (décochez temporairement le bouton 2D pour cette étape). Renommez-le ainsi dans la Hierarchy.
Nous allons préparer une interface pour apprendre à afficher ou masquer un objet. Nous utiliserons pour cela deux boutons, un qui dit « Visible » et l’autre « Invisible ». Vous pouvez aussi les nommer « Afficher » et « Masquer », à votre convenance. Pour aller plus vite, je ne modifierai pas l’aspect des boutons par défaut.
La Hierarchy montre l’imbrication des UI Objects. Une fois le Canvas créé, ajoutez un Panel (ce sera la bande grise transparente en bas de l’écran, à dimensionner correctement avec les poignées bleues.), puis deux Buttons. Rendez les boutons dépendants (Enfants) du Panel en les faisant glisser dessus dans la Hierarchy. Vous devriez obtenir le résultat ci-dessous.

Réglez, dans le Component Image du Panel, la Color d’arrière plan, comme ci-dessous à gauche.
Sur l’écran à droite, il faut ajuster les Anchors en choisissant leur Mode par le carré en haut à gauche. Le meilleur choix est strech/strech.


Pour rendre Responsive le Panel, il faut que les Anchors soient aux dimensions du Panel. Les Anchors se modifient manuellement avec les petits triangles aux coins du Canvas. Quand c’est OK, les Anchors sont confondus avec les Poignées bleues.


Le résultat dans le Game, ci-dessous, avec en plus un cube rouge, nommé « Cube_Rouge » sur le sol (à ajouter à votre Scene).

• Interface par dessus le jeu
Cet aspect, plus complexe, qui consiste à intégrer des éléments d’interface dans l’univers 3D du jeu, ne sera pas traité ici.
• Afficher/Masquer des objets par des boutons et des actions
Afin de contrôler les deux Buttons, nous n’allons pas placer un Script sur chacun d’eux. Nous allons créer un Script global qui doit être supporté par un objet invisible.
Créez un Empty Object et renommez-le « ScriptManager ». Placez-le tout en haut de la liste dans la Hierarchy et aux coordonnées ZERO sur la Scene (Reset dans l’Inspector) . Ce n’est pas obligatoire pour qu’il fonctionne, mais c’est une convention à respecter.
Créez ensuite un nouveau Script nommé « Activate_Object » et faites-le glisser sur le ScriptManager (Attention de bien nommer votre Script immédiatement après l’avoir créé, sinon, il risque d’y avoir des erreurs).
Voilà ci-dessous le code complet, à enregistrer après l’avoir saisi dans votre Script :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Activate_Object : MonoBehaviour {
public GameObject cubeRouge;
void Start() {}
void Update() {}
public void activer() {
cubeRouge.SetActive(true);
}
public void desactiver() {
cubeRouge.SetActive(false);
}
}
La commande qui permet de contrôler l’affichage (ou plus exactement l’activation) d’un objet dans Unity est « SetActive()« .
Dans un premier temps, dans le Script, il faut déclarer comme variable de type GameObject, le Cube Rouge dont on veut contrôler l’affichage. C’est le rôle de la ligne :
public GameObject cubeRouge;
Le nom cubeRouge est volontairement différent du nom de l’Objet.
Cela fait apparaitre dans l’Inspector, dans le Component du Script (voir la copie d’écran ci-dessous), une ligne correspondant à cette variable.
Il faut associer cette variable au GameObject qui est concerné. Faites donc glisser l’objet Cube_Rouge depuis la Hierarchy vers la zone correspondante dans l’Inspector.

Vous pouvez ensuite supprimer les deux fonctions de base void Start() et void Update(), inutiles dans ce Script. Je les ai cependant conservées même si ce n’est pas nécessaire.
Ajoutez deux fonctions dont nous pouvons choisir le nom comme bon vous semble : void activer() et void desactiver() par exemple. Ces deux fonctions doivent être publiques afin de pouvoir y accéder dans l’Inspector des boutons. N’oubliez pas les parenthèses et les accolades. Cela donne :
public void activer() { }
Enfin dans chaque fonction, à l’intérieur des accolades, on va déclarer le SetActive() à true pour afficher le cube rouge ou à false pour le masquer. Ce qui donne par exemple :
cubeRouge.SetActive(true);
Puis, pour chaque bouton, dans l’Inspector se trouve une zone d’interaction qui permet de choisir une fonction d’un Script à associer au comportement On Click(), c’est à dire qui doit être exécutée lorsqu’on clique sur le bouton.
Sélectionnez un bouton depuis la Hierachy. Dans l’Inspector, en bas du Component Button, cliquez sur le +. Cela fait apparaitre une zone de réglage.
Il y a trois réglages dans cette zone.
1. Le Menu local en haut à gauche permet de choisir quand exécuter la fonction. Choisir Runtime Only (par défaut). Cela ne fonctionne que lorsqu’on lance le jeu, donc dans la fenêtre Game.
2. La zone à compléter, juste en dessous à gauche, permet de dire quel est le Script qui contient la fonction à exécuter. Faites glisser ici le Script ScriptManager, comme ci-dessous.
3. Il faut enfin, dans le Menu local en haut à droite, choisir quelle fonction de ce Script il faut lancer.



Enregistrez et Testez le jeu en lançant le bouton Play. Le résultat est à tester dans la fenêtre Game bien entendu.
3. Les Animations
Il y a deux systèmes d’animation intégrés à Unity : L’Animation et l’Animator, qui se traduisent par deux Assets distincts..
Le premier est l’Animation, sous forme d’un triangle bleu. C’est le moyen le plus ancien et le plus simple. Il se limite aux animations 3D. Ce système utilise une fenêtre d’Unity avec une TimeLine, comme dans AfterEffects ou Blender, la Window Animation.
Le second, l’Animator Controller sous forme de deux carrés, est plus récent et plus puissant, capable de gérer des animations 2D et des animations de Texture. Il fonctionne avec des Nodes et reste plus complexe à utiliser.
Dans les versions récentes d’Unity, lorsqu’on crée une animation, les deux Assets sont générés automatiquement, même si l’Animator n’est pas toujours utilisé. Nous verrons d’abord l’Asset Animation.

• Création de l’environnement
Créez une nouvelle Scene nommée « Level2 »).
Créez sur cette Scene un sol avec un Plane ou un Cube applati. Placez en plus trois Cubes et aplatissez-les comme des plate-formes. Positionnez-les comme ci-dessous. Créez des Materials pour les distinguer (le jeu que nous allons créer est basé sur l’utilisation des couleurs RGB; il consistera à passer d’une plate-forme à l’autre, dans l’ordre de ces trois couleurs). Renommez-les en fonction de leur usage. Pour ma part je les ai nommées respectivement Plateforme_Start, Plateforme_Move et Plateforme_Win.
Créez également une troisième Scene, nommée « Level3 ».
Ajoutez ces Scenes aux Build Profiles.
• Ajout du personnage TPC
ATTENTION, Obsolète, SI VOUS UTILISEZ LES STANDARD ASSETS : après avoir importé et corrigé les Standard Assets (utilisez un dossier local déjà corrigé) placez un Third Person Character sur la plate-forme de départ, la Rouge.
Sinon, importez les Starter Assets Third Person et placez un Prefab Third Person Player Armature sur la plateforme rouge, de départ.
Si les Materials ne s’affichent pas correctement pour le personnage (il apparait en rose), dans les Assets, sélectionnez les Materials du personnage et pour chacun, dans l’Inspector, choisir Shader > Standard.

• Création de l’animation

Sélectionnez la plate-forme Verte, celle qui va se déplacer. Les deux autres resteront fixes.
Allez dans le Menu Window > Animation > Animation pour ouvrir la fenêtre d’animation. Positionnez-là comme cela vous arrange dans l’interface.
La plate-forme Verte étant sélectionnée, il faut commencer par créer une Animation. Cliquez sur le Bouton Create.
Vous devez nommer et enregistrer cette Animation. Pensez à créer d’abord un nouveau Dossier « Animation » dans les Assets. Nommez-la PlateformeMove et enregistrez. Cela crée une Animation à gauche et un Animator Controller à droite, voir ci-dessous.


Dans le panneau Animation, cliquez sur le Bouton Add Property et choisissez la propriété à animer. Ici nous voulons créer un déplacement. Aussi, nous allons choisir la Propriété Transform > Position en cliquant sur le + à droite.

La propriété apparait dans le panneau de gauche et des images clés dans la Time Line sur une durée de 1 seconde par défaut. Cliquez sur la flèche à gauche de la Propriété pour faire apparaitre les valeurs détaillées.

Pour créer le mouvement, il faut passer en Mode Enregistrement.
Pour cela, cliquez sur le bouton Cercle Rouge en haut à gauche de la fenêtre Animation.
Puis placez la tête de lecture à 1 seconde en cliquant sur la TimeLine, là où est inscrit le temps, dans la zone rouge. La Tête de Lecture est la fine bande blanche verticale. Vous pouvez la déplacer avec la Souris. Le positionnement dans le temps s’affiche en même temps que vous la déplacez. En haut à droite du panneau des propriétés, la position de la Tête de Lecture s’affiche en Frames. Ci-dessous, 60 Frames correspondent à une seconde.
Vous pouvez alors soit déplacer librement l’Objet à animer sur la Scene, soit modifier les valeurs des propriétés. Le but ici est d’amener la plateforme verte contre la rouge, où se trouve le personnage.

Il faut ensuite boucler le mouvement en ramenant la plateforme verte contre la bleue, à sa position de départ. Pour cela, il suffit de copier/coller les images clés initiales plus loin dans le temps, à 2 secondes. Sélectionnez les images clés initiales. Copiez-les. Placez la Tête de Lecture sur 2 secondes. Collez.
Vous pouvez à présent arrêter l’enregistrement. Déplacez la tête de lecture avec la Souris ou cliquez sur le Bouton Play des contrôleurs pour voir l’animation se jouer.

Cependant, la durée de l’animation est très courte et le mouvement rapide rend le jeu trop difficile. Sélectionnez les images clés et déplacez-les plus loin, respectivement à 2 et 4 secondes par exemple. Ajustez même à 4 et 8 secondes si besoin car ce n’est pas évident du tout.
• Corriger le Bug d’adhérence
Mais si vous lancez le jeu par le Bouton Play en haut de la fenêtre d’Unity, vous verrez dans la fenêtre Game que lorsque vous faites avancer le personnage sur la plate-forme verte, il ne la suit pas et finit par tomber. Il est cependant possible de faire courir le personnage (SHIFT Flèche), ce qui peut être un choix de jeu…
Mais, pour corriger ce défaut, il faut créer pour la plate-forme verte un second Box Collider, déclaré en Trigger, de sorte que lorsque le personnage entre dedans, il devient Child (Enfant) de la plate-forme. Ainsi, il sera entrainé avec. Lorsqu’il la quittera, le parentage sera supprimé.
Sélectionnez la plate-forme verte. Dans l’Inspector, dupliquez le Box Collider existant par Clic Droit > Copy Component, puis par Clic Droit > Paste Component As New. Cochez la case Is Trigger du premier Box Collider et indiquez les valeurs ci-dessous en Y pour les deux Colliders. Vous voyez en bas à gauche le Collider Trigger dépasser au dessus de la plate forme. Il est aussi possible de cocher le Bouton Edit Collider et de manipuler les points du Box Collider pour en modifier l’épaisseur et la position sur la Scene. Vous pouvez voir le résultat en bas à gauche.
Le Trigger doit dépasser suffisamment sinon cela ne fonctionne pas, le Player n’étant pas détecté. N’hésitez donc pas à lui donner une Size en Y de 4 ou 5.



Il reste à créer un nouveau Script, que je nommerai « PlatformAttach ». Éditez ce Script et saisissez le code suivant :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlatformAttach : MonoBehaviour {
public GameObject Player;
private void OnTriggerEnter(Collider other) {
if(other.gameObject == Player) {
gameObject.GetComponent<Renderer>().material.color = Color.red;
Player.transform.parent = transform;
}
}
private void OnTriggerExit(Collider other) {
if(other.gameObject == Player) {
gameObject.GetComponent<Renderer>().material.color = Color.green;
Player.transform.parent = null;
}
}
}
Faites glisser ce Script sur le plate-forme verte. Si vous lancez le jeu, vous vous rendrez compte qu’il ne fonctionne pas. Il est fait allusion dans le Script à un GameObject nommé Player. Il désigne le personnage du jeu. Il faut donc associer ce personnage au Script. Dans l’Inspector de la plate-forme verte, dans le Component du Script, il y a une zone Player qui vient de la ligne du Script « public GameObject Player; Il faut faire glisser le personnage « Player Armature » depuis la Hierarchy sur la case du Player, comme ci-dessous dans l’écran de droite.
Enfin, il reste un petit réglage à faire pour que cela fonctionne. Allez au Menu Edit > Project Settings. Dans la catégorie Physics > Settings, onglet GameObject, il faut cocher la case Auto Sync Transforms (ça ne s’invente pas!).
• Gagner le Niveau 2 – Passer au Niveau 3
Faites pour la plateforme bleue la même chose que pour la verte, à savoir, dupliquez le Box Collider, déclarez-le en Is Trigger et remontez le en altitude et épaisseur, de sorte qu’il y ait collision lorsque le personnage entrera sur cette plateforme.
Créez un nouveau Script, nommé Win2 pour passer au niveau 3. Voici le code :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Win2 : MonoBehaviour
{
public GameObject Player;
private void OnTriggerEnter(Collider other) {
if(other.gameObject == Player) {
gameObject.GetComponent<Renderer>().material.color = Color.red;
SceneManager.LoadScene(3);
}
}
}
Faites également glisser l’Objet Player sur la case appropriée du Script Win2 dans l’Inspector de la plateforme bleue.
Testez. Si vous arrivez à rejoindre la dernière plateforme, la Scene Level3 s’affichera.
Il est à noter que dans les deux scripts précédents, il y a une commande pour changer la couleur en rouge de la plateforme qui est atteinte ou quittée. C’est un bon moyen de vérifier que le code fonctionne et que la collision est bien détectée.
On pourrait ainsi créer d’autres niveaux avec des plateformes animées. Je vous laisse le soin d’en imaginer vous-mêmes avec des plateformes qui se déplacent verticalement ou qui tournent…
4. Préparer les éléments de la Scene « Level3 »
Dans cette Scene, nous allons placer un Plane pour le Sol et trois Cubes, respectivement Red, Green et Blue et un Cube pour un Mur, comme sur l’image ci-dessous.
Il faudra ensuite ajouter un Player, un TPS, joueur à la Troisième Personne issu des Starter Assets, à importer donc comme dans le niveau précédent.
Vous pourriez aussi choisir de placer un FPS, à installer comme expliqué page précédente :
– Importer le FPS dans les Assets,
– Placer un PlayerCapsule et un PlayerFollowCamera dans la Hierarchy,
– Régler le Follow du PlayerFollowCamera sur PlayerCameraRoot,
– Placer le PlayerFollowCamera au même endroit que le PlayerCapsule,
– Ajouter à la Main Camera un Component Cinemachine > CinemachineBrain.
Testez que le Player fonctionne bien et orientez-le correctement.
Le joueur va devoir attraper les cubes dans l’ordre RBG. Mais un Mur va venir compliquer le jeu. En effet, lorsque le joueur, après avoir vu les trois Cubes sur le Sol, attrapera le Cube Rouge, le Mur, préalablement masqué, va apparaître.
Il lui faudra activer le déplacement du mur, en évitant le Cube Bleu pour accéder au Cube Vert.
Chaque fois qu’il attrapera un Cube, ce dernier disparaitra, un Son sera joué et un Particle System se déclenchera.
Pour déclencher tous ces événement, il faudra également disposer différents Cubes invisibles, qui serviront de Trigger.

Je vous laisse reproduire ou adapter ce schéma. Vous pouvez voir ci-contre, dans la Hierarchy, la totalité des Objets pour l’environnement.
5. Des Scripts pour l’affichage des Objets
• Afficher / Masquer des objets avec un Trigger
Pour mémoire, un Trigger est un Objet dont le Component Box Collider est déclaré IsTrigger. Cela permet de détecter des collisions pour déclencher des événements. En C#, il y a trois événements de type Trigger : OnTriggerEnter(), OnTriggerStay() et OnTriggerExit().
Pour obtenir le même résultat que précédemment avec des boutons, mais lorsqu’un joueur cogne un objet, il faut créer un Script à placer sur un Objet comportant un Trigger. On peut par exemple sélectionner le Cube bleu et dans l’Inspector, cocher la case Is Trigger du Component Box Collider.

Créez un Script nommé « CubeBlueTrigger« , enregistrez-le et glissez-le sur le Cube bleu.
Saisissez ensuite le code ci-dessous, associez l’Object Cube_Blue à la variable dans le Component du Script et testez :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeBlueTrigger : MonoBehaviour {
public GameObject blueCube;
private void OnTriggerEnter() {
//Destroy(gameObject);
blueCube.SetActive(false);
}
private void OnTriggerExit() {
//Destroy(gameObject);
blueCube.SetActive(true);
}
}
Vous constaterez que lorsque le joueur se cogne au Cube bleu (OnTriggerEnter), ce dernier devient invisible. Il n’est cependant pas possible de le rendre de nouveau visible en s’éloignant (OnTriggerExit) car il est désactivé et ne réagit donc plus. Ce n’est donc pas une bonne méthode pour faire disparaitre et réapparaitre un Objet car cela ne fonctionne que dans un sens.
Pour y arriver correctement, il faut dupliquer le Cube Bleu au même endroit et agrandir un peu la copie. Nous nommerons la copie Cube_Blue_T (T pour Trigger).
Décochez la case Is Trigger du Cube Bleu original et sa case Box Collider. Il faut également supprimer son Component Script.
La copie sera par contre déclarée en Trigger, comme déjà vu et sera masquée en décochant sa case du Mesh Renderer.
C’est sur elle qu’il faudra placer le Script, en l’adaptant légèrement, comme ci-dessous avec une seconde variable pour le Trigger et en modifiant les références des variables dans l’Inspector.
Vous pouvez tester.


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CubeBlueTrigger : MonoBehaviour {
public GameObject blueCube;
public GameObject blueCubeT;
private void OnTriggerEnter() {
//Destroy(gameObject);
blueCube.SetActive(false);
}
private void OnTriggerExit() {
//Destroy(gameObject);
blueCube.SetActive(true);
}
}
• Faire apparaitre le Mur
Voici ci-dessous, en trois images le scénario du jeu. La première image représente ce que voit le joueur au début du niveau. En se déplaçant, le joueur découvre le Cube Rouge, à cogner en premier. Lorsqu’il rentre en collision avec le Cube Rouge, le Mur apparait , cachant le Cube Vert.
Nous verrons plus loin qu’en même temps, le cube rouge disparait avec un son et un effet.



Le Mur sera donc désactivé par défaut en décochant sa case principale dans l’Inspector, ci-contre.


Sur le modèle du Cube Bleu, nous allons donc créer un Cube Trigger pour le Cube Rouge en le nommant « Cube_Red_T« .
Ci-contre, l’Inspector du Trigger et le code.
Créez un nouveau Script, nommez-le Activate_Wall et appliquez-le au cube Rouge Trigger Cube_Red_T.
Voici le code ci-dessous :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Activate_Wall : MonoBehaviour {
public GameObject wall;
public GameObject redCube;
private void OnTriggerEnter() {
wall.SetActive(true);
}
}
• Supprimer un objet
Pour faire disparaitre un objet, après l’avoir touché par exemple, il y a une autre méthode que celle vue précédemment, c’est « Destroy(gameObject)« ; Ajoutez deux lignes de code au Script précédent, juste après la ligne pour afficher le mur, avant l’avant dernière accolade. Ci dessous, le code modifié de la fonction OnTriggerEnter(). La première ligne Destroy supprime le Cube Rouge. La seconde ligne Destroy supprime le Trigger pour qu’il n’agisse plus :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Activate_Wall : MonoBehaviour {
public GameObject wall;
public GameObject redCube;
private void OnTriggerEnter() {
wall.SetActive(true);
Destroy(redCube.gameObject);
Destroy(gameObject);
}
}
Il y a une autre façon de procéder.
Pour supprimer les deux d’un coup, il faut rendre le cube rouge enfant de son trigger. Dans la Hierarchy, faites glisser l’Objet cube_Red sur l’objet cube_Red_T. Faites de même avec les 2 autres cubes.
Puis, dans le script, commenter partout les lignes visant redCube.
public GameObject wall;
//public GameObject redCube;
private void OnTriggerEnter() {
wall.SetActive(true);
//Destroy(redCube.gameObject);
Destroy(gameObject);
}
• Déclencher une animation
Comme vu précédemment, vous pouvez créer une animation pour le Mur afin de le déplacer (Position) et de modifier sa dimension (Scale) afin qu’il permette au joueur de rejoindre le Cube Vert.
Par défaut cette animation va se jouer en continu. Il faudra commencer par la bloquer.
Puis, il faudra ajouter un Cube Trigger quelque part pour déclencher l’animation. Pour corser un peu le jeu, nous pouvons le placer devant le mur, pas très loin du Cube Bleu, sachant qu’il ne faut pas toucher le Cube Bleu avant le Vert (nous ne gérerons cependant pas cet aspect du jeu).
Réactivez le Mur pour pouvoir le voir (cochez sa case principale dans l’Inspector). Ajoutez, contre le mur, un Cube nommé « Poussoir » et déclaré Is Trigger, avec un Material vert.

Dans l’Inspector du Cube Poussoir, cochez la case Is Trigger. Si vous décochez le Mesh Renderer comme ci-contre, afin de le rendre invisible, le joueur devra le trouver. C’est plus difficile.
Sélectionnez le Mur. Menu Window > Animation > Animation. Enregistez cette animation sous le nom « OuvrirMur ».
Add Propety pour Position et Scale.
À droite de la TimeLine, les points de suspension ouvrent un Menu où vous pouvez vérifier la cadence : Set Sample Rate > 60 ims par défaut.

Vous pouvez réaliser l’animation comme vu plus haut. Il faut à la fois réduire la largeur du Mur et le déplacer afin que son côté droit reste à la même place.
Voir ci-dessous les valeurs pour l’image 0 et l’image 2 sec.
Dans les Assets, l’animation comporte les deux composants, l’Animation « OuvrirMur » (le triangle à gauche) et l’Animator « Mur » à droite.
Cette fois, c’est ce dernier que nous allons utiliser.

Double-Cliquez sur l’Animator « Mur ». Cela ouvre la fenêtre d’Animator. Elle contient des « nodes », c’est à dire des boîtes de contrôle de différentes couleurs pour la gestion de l’animation.


Par ailleurs, dans l’Inspector du Mur, vous pouvez voir son Component Animator.
Dans la fenêtre Animator, nous allons gérer des états, que nous allons relier entre eux pour créer le scénario de l’animation.
La boîte verte Entry correspond au lancement de l’animation, la boîte rouge Exit, à sa fin.
La boîte orange « OuvrirMur » représente l’animation elle-même, c’est à dire ce que contient le composant Animation des Assets, que l’on contrôle dans la TimeLine.
La flèche orange entre Entry et OuvrirMur indique qu’il faut jouer l’animation au démarrage du jeu.
Dans un premier temps, il va falloir créer un état vide, dans lequel il ne se passe rien, que nous allons relier à la boîte Entry, de sorte qu’au démarrage, l’animation ne se joue pas automatiquement.
Clic Droit > CreateState > Empty
Une boîte grise, nommée New State est alors ajoutée.


Il faut lui indiquer que c’est une boîte de démarrage où il se passe rien.
Clic Droit sur cette boîte > Set as Layer Default State
La boîte Entry est alors automatiquement reliée à cette boîte. Celle-ci devient alors orange et la boîte de l’animation devient grise.
Si vous lancez le jeu, le mur reste fermé.


Puis, dans la fenêtre Animator, cliquez sur l’onglet Parameters, en haut à gauche, à droite de Layers.
Cliquez sur le bouton « + » et choisir Bool. Renommez-le « ouvrir« , comme ci-dessous.


Dans la fenêtre Animator, sélectionnez la boîte NewState et en haut de l’Inspector, renommez-la « FermerMur« . Faites un Clic droit dessus et choisissez Transition. Vous devez alors relier cette boîte à la boîte « OuvrirMur ».
Dans l’Inspector de la boîte « FermerMur« , cliquez sur le nom de la transition « FermerMur -> OuvrirMur« , voir ci-dessous à gauche.
Vous avez alors accès aux Conditions. Cliquez sur le bouton « + » sous les conditions.
La condition « ouvrir » s’affiche, créée précédemment en tant que Bool. Elle peut avoir la valeur true ou false. Laisser la valeur à true. Cela signifie que lorsque cette valeur passera à true, autrement dit lorsque le joueur touchera le Trigger Cube, la transition va s’activer et l’animation va se jouer. Le mur va s’ouvrir et laisser l’accès au cube vert.


Dans l’Inspector de l’Animation (cliquez sur le triangle dans les Assets), il faut aussi décocher le bouton Loop Time, afin que l’animation ne se joue pas en boucle, mais une seule fois.
Sélectionnez le Cube Trigger « Poussoir« . Créez un nouveau Script « OpenWall » et associez-le au cube, comme ci-dessous à gauche.
Voici le code du Script pour ouvrir le mur lorsque le joueur touche le Trigger.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class OpenWall : MonoBehaviour {
public Animator ouvre_mur;
private void OnTriggerEnter() {
ouvre_mur.SetBool("ouvrir", true);
}
}
Dans son Inspector, faites glisser l’Objet Mur depuis la Hierarchy vers la zone de la variable Ouvre_mur ou cliquez sur le cercle à droite de cette zone et choisir l’Objet Mur, comme ci-dessous à droite.


Désactivez l’Objet Mur, enregistrez et testez.
6. Les Particules
Les Particles Systems font partie des Effets. Cela permet de simuler plein de situations, fumée, feu, explosion, feu d’artifice, gouttes d’eau et bien d’autres. Il s’agit d’émettre une forme ou une image de manière continue avec un grand nombre de paramètres de contrôle.
• Utiliser un Prefab existant de particules : Standard Assets (obsolète)
Dans les Standard Assets, il y a un certain nombre de Prefabs de particules fournis. Ils permettent déjà beaucoup de choses.
Nous allons utiliser le Prefab Steam pour générer un nuage de vapeur lorsque les cubes disparaitront après que le joueur les aura touchés. Mais essayez les autres par curiosité.

Faites glisser le Prefab Steam sur la Scene ou dans la Hierarchy. Positionnez-le comme souhaité sur la Scene, au même endroit que le Cube Rouge par exemple.

Dans le Component Particle System vous pouvez régler la durée de l’Effet (Duration), le faire jouer une fois ou en boucle (Looping), changer sa couleur en rouge (Start Color) et tester les autres réglages par vous-même.

Sur la Scene, l’Objet Particle System apparait sous forme de petites hélices blanches. Le panneau Particle Effect en bas à droite permet de tester l’effet en modifiant certains paramètres.
Le résultat plus bas, avec l’apparition de vapeur rouge.


• Utiliser un Prefab existant de particules : Sherbb’s Collection
Allez dans l’Asset Store, connectez-vous à votre compte si besoin et tapez « particle » dans la recherche. Limitez la recherche aux Free Assets. Repérez dans les résultats le Pack Sherbb’s Particle Collection.
Cliquez sur le bouton Add to My Assets.
Dans Unity, dans le Menu Window > Package Manager choisissez My Assets, cliquez sur le Pack ci-dessus puis sur Download.
Dans la fenêtre qui s’ouvre, gardez tout coché et cliquez sur Import.
Un nouveau dossier apparait dans les Assets.
Dans la Scene Level3, ouvrez le dossier Sherbb’s > Particles > Normal dans les Assets. Double cliquez sur les différents Prefabs pour voir à quoi ils ressemblent. Repérez le BirthdayConfetti et faites-le glisser dans la Hierarchy.
Placez le Prefab juste au dessus du cube rouge.
Sur la Scene, le panneau Particles en bas à droite permet de tester l’effet en modifiant certains paramètres.
• Déclencher l’effet avec un Script
Nous allons faire en sorte que l’effet se déclenche lorsque le joueur entre en collision avec le cube rouge, en même temps que le cube disparait et que le Mur apparait.
Depuis les Assets, ouvrez le Script « Activate_Wall ».
Il faut commencer par rajouter une variable dédiée au Particle System, appelons-la « explosion« . Cette variable doit être publique.
Puis, dans la fonction OnTriggerEnter() il faut lancer cet élément avec la méthode Play() :
explosion.Play();
Voici le code :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Activate_Wall : MonoBehaviour {
public GameObject wall;
public GameObject redCubeT;
public ParticleSystem explosion;
private void OnTriggerEnter() {
wall.SetActive(true);
Destroy(redCubeT.gameObject);
Destroy(gameObject);
explosion.Play();
}
}
Enfin, ne pas oublier d’associer l’Objet concerné depuis la Hierarchy vers la variable correspondante.
Afficher pour celà l’Inspector du Trigger Cube_Red_T. Faites glisser le systeme de particules « BirthdauConfetti » dans la case explosion du Script, comme ci-contre.
• Créer un Système de Particules personnalisé
Pour créer un système de particules personnalisé, faites un Clic Droit sur la Hierarchy et demandez Effects > Particle System.
Voir le résultat sur la Scene ci-dessous.


Cet Objet sélectionné, l’Inspector ci-dessous à gauche présente les très nombreux réglages disponibles. Par défaut, l’effet est celui de l’émission de petites billes.
Il y a, visibles sur l’écran à droite ci-dessous, trois familles de réglages cochés par défaut parmi tous ceux disponibles : Emission, Shape et Renderer. Ce sont les principaux et si l’un d’eux est décoché, l’effet ne sera plus visible.
En bas à droite l’onglet Emission permet de modifier la quantité de particules émises en même temps par Rate over Time.



Ensuite, l’onglet Shape agit sur la forme globale dans laquelle les particules sont émises. Par défaut le Shape est un Cône, mais il y en a plein d’autres. Essayez pour voir par vous-même. Les autres paramètres permettent d’ajuster la Shape choisie.


Enfin, l’onglet Renderer permet notamment de choisir l’aspect des particules dans le réglage Material. Cliquez sur le petit cercle à droite du Material Particles Unlit. Une fenêtre Select Material vous propose de choisir un Material parmi ceux présents dans les Assets du Project.
Nous allons changer ce Material.



Il faut donc commencer par créer un Material. Partons d’une image PNG, à fond transparent, préparée dans Photoshop.
Importez cette image dans les Assets, dans un sous-dossier adapté (« Images » pour ce qui me concerne, un dossier Texture serait bien aussi) simplement en la faisant glisser.


Créez un nouveau Material dans les Assets, toujours dans un Dossier adapté. Appliquez l’image importée sur le Material en tant que Base Map. Je nomme ce Material « light« .



Enfin, comme précédemment, dans l’Inspector du Particle System, cliquez sur le petit cercle de choix du Material dans l’onglet Renderer et dans la fenêtre Select Material, choisissez le Material « light« .
Voici le résultat ci-dessous, avec les réglages par défaut, dans la Scene et dans le Game.


7. Le son
Il est très simple d’ajouter un Son à votre projet. Utilisez un son au format MP3 par exemple. Vous pouvez en trouver sur des sites de sons gratuits ou le créer vous-même. Par exemple https://www.sound-fishing.net
Pensez simplement à nettoyer les sons en supprimant les zones silencieuses au début ou à la fin si elles ne sont pas nécessaires, et qui pourraient produire des retards d’effet bizarres.
Pensez également à ajuster la durée de vos sons en fonction de leur usage, son d’impact, son d’accompagnement en boucle, etc. Il faut faire attention que les sons ne soient pas trop lourds en poids de fichier pour ne pas ralentir le jeu.
• Importer un son
Importez votre Son dans les Assets, dans un Dossier adapté, en le faisant glisser à l’intérieur, comme ci-dessous.
Pour l’utiliser, faites le glisser depuis les Assets vers la Hierarchy. Un haut parleur blanc le matérialise sur la Scene.


L’inspector présente quelques réglages importants dans le Component Audio Source.
Pour éviter que le Son se lance au démarrage du jeu, notamment si le Son doit être déclenché par un événement du jeu, il faut décocher la case Play On Awake. À l’inverse, vous pouvez la garder cochée s’il s’agit d’un son d’ambiance.
De même la case Loop permet de jouer le Son en continu. Il faut la décocher pour un bruit d’impact.
• Déclencher le son sur un événement
Il faut de nouveau rajouter une variable, dédiées au Sound cette fois. Nous choisirons « sound_Red » pour le Type AudioSource en tant que variable publique.
Dans la fonction OnTriggerEnter() du Script Activate_Wall, ajoutez :
sound_Red.Play();
Voici donc le code complet, avec les particules et le son :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Activate_Wall : MonoBehaviour {
public GameObject wall;
public GameObject cubeRed;
public AudioSource sound_Red;
public ParticleSystem vapeur;
private void OnTriggerEnter() {
wall.SetActive(true);
Destroy(gameObject);
Destroy(cubeRed.gameObject);
sound_Red.Play();
vapeur.Play();
}
}
Faites glisser le Son de la Hierarchy vers la variable dans l’Inspector du cube rouge Trigger, dans le Component du Script, comme précédemment pour les particules, enregistrez et testez.
8. Finaliser les interactions
Il reste donc à faire la même chose pour les deux autres cubes, rajouter des particules et du son.
On pourrait également tester l’ordre dans lequel les cubes sont détruits et empêcher que le cube bleu ou vert soit atteint avant le rouge etc. Cela nécessiterait l’emploi de variables booleennes pour donner l’état des cubes et de conditions dans les Scripts.
On pourrait également afficher un Score…
et imaginer d’autres niveaux.



























































