Cours 9¶
Tranche verticale¶

Phase de test des jeux en classe. (Ne pas expliquer son jeu)
- Sur GitHub, ouvrir le repo de votre jeu
- Créer un fichier
tranche-verticale.md(Add file > Create new file) - Cliquer sur Commit changes...
- Cliquer sur
tranche-verticale.md - Cliquer sur le petit crayon en haut à droite et laisser la page ouverte
- Ouvrir son jeu dans Unity
- Régler le bon niveau sonore du jeu
- Changer de poste et démarrer le jeu
- Lorsque vous avez terminé, faire Stop dans Unity
- Ouvrir la page du fichier
tranche-verticale.mdet écrire 2 rétroactions :- Ce que vous avez aimé
- Ce qui doit être amélioré
Sujets d'analyse
Environnement, HUD, Affordance, Éclairage, Prérequis, Audio, Créativité
Divers¶
Activer ou désactiver le tir du « Character Controller »

- Sur le PlayerArmature ou PlayerCapsule, décocher le tir dans l'Inspector
- Sur un CES, ajouter une action Invoke Events
- Objet = PlayerArmature ou PlayerCapsule
- Fonction = Tir, puis bool enabled
- Cocher la case pour l'activer
Le « Character Controller » bloque la souris, et ce, à travers toutes les scènes

Le script suivant vous permet, au chargement de la scène ou via une Action CES, d'activer ou désactiver la souris.
- Dans la Hierarchy : clic-droit Create Empty
- Appliquer ce script sur l'objet :
using UnityEngine;
public class MouseLock : MonoBehaviour
{
public bool locked = false;
void Start()
{
SetLocked(locked);
}
public void SetLocked(bool value)
{
locked = value;
Cursor.lockState = locked ? CursorLockMode.Locked : CursorLockMode.None;
Cursor.visible = !locked;
}
}
Déclencher une action, avant, pendant ou après une animation

Utiliser un Animation Event.
-
Placer le script suivant sur le GameObject animé
AnimationEventRelay.csusing UnityEngine; using UnityEngine.Events; public class AnimationEventRelay : MonoBehaviour { public UnityEvent onAnimationEvent; public void Trigger() { onAnimationEvent.Invoke(); } } -
Dans le panneau Animation, placer le curseur au moment où déclencher l'événement
- Cliquer sur l'icône Add Event
- Dans l'Inspector, dans Function, choisir AnimationEventRelay > Methods > Trigger ()
PNJ¶
Le personnage non-joueur (PNJ ou NPC) se décrit selon deux axes :
Déplacement¶
- Statique (idle) : reste en place, animé ou non
- Errance (wander) : se déplace au hasard dans une zone, avec des pauses
- Patrouille (patrol) : suit un trajet défini par des points de passage
- Poursuite (follow) : se déplace vers une cible
- Fuite (flee) : s'éloigne d'une cible
Rôle¶
- Décor : anime le monde, aucune interaction
- Interactif non hostile : guide, marchand, dialogue
- Hostile : menace le joueur et peut provoquer un échec
Un PNJ combine donc un mode de déplacement et un rôle.
PNJ en attente (idle)¶
Un PNJ en attente reste en place. Il peut être animé ou pas.
Animer un PNJ en attente¶

Mixamo est un service gratuit d'Adobe qui offre une banque de plusieurs animations d'humanoïdes.
Ça tombe bien, les personnages Synty sont humanoïdes et ont déjà un squelette prêt à être animé. C'est ce que nous exploiterons.
Télécharger l'animation¶
- Aller sur mixamo.com et se connecter avec votre compte Adobe
- Cliquer sur Upload Character et choisir un personnage Polygon en format FBX (ex. :
Models/Characters.fbx) - Choisir une animation sur mixamo.com
- Cliquer sur Download, régler les champs ci-dessous, puis cliquer sur Download :
| Champ | Valeur |
|---|---|
| Frames per Second | 60 |
| Pose (si affiché) | Original Pose |
| Skin (si affiché) | Without Skin |

Plusieurs personnages superposés 🤨

Le fichier Characters.fbx d'un pack Synty contient tous les personnages du pack sur un seul squelette. Dans Mixamo, ils apparaissent superposés : c'est normal. Avec Without Skin, aucun de ces maillages ne se retrouve dans le fichier téléchargé.
Configurer le rig¶
- Glisser le FBX téléchargé dans 📁 Assets > 📁 _ > 📁 Animations
- Dans l'Inspector, onglet Rig : Animation Type =
Humanoid, puis Apply - Avatar Definition =
Copy From Other Avatar- Source =
CharactersAvatar(ex. : 📁 SyntyStudios > 📁 PolygonCity > 📁 Models > Characters > CharactersAvatar)
- Source =

Configurer le clip¶
- Dans l'Inspector, onglet Animation
- Renommer le clip (ex. :
Idle; par défaut, c'estmixamo.com). C'est le champ à droite du triangle turquoise - Pour boucler l'animation, cocher Loop Time
- Cocher Bake Into Pose dans les trois sections Root Transform (Rotation, Position Y, Position XZ)
- Cliquer sur Apply

Certaines animations se configurent différemment
Certaines animations sont faites pour ne jouer qu'une seule fois. Dans ce cas, laisser Loop Time décoché.
D'autres, comme la marche, déplacent le personnage. Pour laisser Unity s'en charger, il faut donc décocher Bake Into Pose dans Root Transform Position (XZ).
Code des couleurs : = boucle propre,
= léger décalage,
= saut visible.
Créer l'Animator¶

- Dans 📁 Assets > 📁 _ > 📁 Animations : clic-droit Create > Animation > Animator Controller
- Clic-droit sur l'Animator Controller > Rename, le nommer
AC_NPC - Double-cliquer sur
AC_NPCpour ouvrir le panneau Animator - Clic-droit dans la grille, Create State > Empty
- Sélectionner
New Statepuis, dans l'Inspector, le renommer (ex. :Idle) et choisir le clip dans le champ Motion
Appliquer l'animation sur un PNJ¶
- Sélectionner le personnage dans la Hierarchy. Dans son composant Animator :
- Controller = le controller créé (
AC_NPC) - Avatar = laisser l'avatar par défaut du personnage Synty
- Apply Root Motion = décoché
- Controller = le controller créé (

PNJ en errance (wander)¶
Un PNJ en errance se déplace au hasard dans une zone, avec des pauses.
Animer un PNJ en errance¶

Préparer le terrain¶
Il faut d'abord créer une zone marchable avec un NavMesh.
- Installer le package AI Navigation : Window > Package Manager > Unity Registry > AI Navigation > Install
- Dans la Hierarchy : clic-droit Create Empty, le nommer
NavMesh - Add Component > NavMesh Surface
-
Cliquer sur Bake : la zone marchable apparaît en bleu dans la Scene
Zone spécifique, plutôt que générale

Sur le NavMesh Surface, Object Collection > Collect Objects =
Volume. Un cube s'affiche : c'est la zone marchable.Exclure une partie du navmesh

- Dans la Hierarchy : clic-droit Create Empty, le nommer
NavMesh Modifier - Add Component > NavMesh Modifier Volume
- Sur le NavMesh Surface, changer Default Area à
Marchable(créer si absent) - Sur le NavMesh Modifier Volume, changer Area Type à
Non marchable(créer si absent) - Sur le NavMesh Surface, cliquer sur Bake
- Dans la Hierarchy : clic-droit Create Empty, le nommer
Il faut ensuite placer le PNJ sur la zone marchable. Celui-ci deviendra ce qu'on appelle un agent.
- Sélectionner le PNJ, puis Add Component > Nav Mesh Agent
-
Placer le PNJ sur une zone bleue du NavMesh

Base offset
Si le PNJ flotte ou s'enfonce dans le sol, vous pouvez ajuster le champ Base Offset sous Nav Mesh Agent.
Déplacement aléatoire¶
L'errance d'un PNJ repose sur le concept de destinations (waypoint) générées aléatoirement. Cette opération se fait en code.
- Ajouter le script
NPCWander.csdans 📁 Assets > 📁 _ > 📁 Scripts - Glisser le script
NPCWander.cssur le PNJ
Pour certains jeux, ça peut convenir et on pourrait s'arrêter là. Toutefois, il ne serait pas étonnant de trouver qu'il manque une animation de marche dans l'équation.
Pour ce faire, il faudrait donc changer d'animation en fonction de l'état du PNJ. C'est ce qui s'appelle une machine à états, ou state machine.
Nouvelle animation de marche ¶

- Aller sur mixamo.com et télécharger une animation de marche
- Configurer son rig
- Configurer son clip
- Renommer le clip (ex. :
Marche; par défaut, c'estmixamo.com) - Cocher Loop Time, puis Bake Into Pose dans Root Transform Rotation et Root Transform Position (Y)
- Garder Bake Into Pose décoché dans Root Transform Position (XZ) : ce sera géré par le script de déplacement
- Renommer le clip (ex. :
Configurer la machine à états
- Double-cliquer sur
AC_NPCpour l'ouvrir dans le panneau Animator - Onglet Parameters du panneau Animator : + > Bool, le nommer
walking
- Clic-droit dans la grille, Create State > Empty
- Sélectionner
New Statepuis, dans l'Inspector, le renommer (ex. :Walk) et choisir le clip de marche dans le champ Motion - Clic-droit sur
Idle> Make Transition versWalk, puis deWalkversIdle
-
Cliquer sur chaque transition (petite flèche blanche) et configurer pour chacune :
Réglage Idle Walk Walk Idle Has Exit Time décoché décoché Conditions walking=truewalking=false
Appliquer la machine à états au PNJ¶
- Dans la Hierarchy, cliquer sur le PNJ
-
Dans l'Inspector, glisser le composant Animator vers le champ Animator sous NPC Wander (Script)
Walk Parameter
La valeur du champ Walk Parameter doit être identique au nom du paramètre dans le panneau Animator

PNJ en poursuite (follow)¶
Un PNJ en poursuite se déplace vers une cible (souvent le joueur) lorsque celle-ci entre dans sa zone de détection.
Déplacement du PNJ¶
La poursuite repose sur des zones de détection autour du PNJ. Cette opération se fait en code.
- Ajouter le script
NPCFollowerEditor.csdans 📁 Assets > 📁 _ > 📁 Scripts > 📁 Editor - Ajouter le script
NPCFollower.csdans 📁 Assets > 📁 _ > 📁 Scripts - Glisser le script
NPCFollower.cssur le PNJ - Glisser PlayerArmature ou PlayerCapsule dans le champ Target
- Pour activer les animations, dans l'Inspector du PNJ, glisser le composant Animator vers le champ Animator sous NPC Follower (Script)
Nouvelle animation de course ¶
Bien qu'il ne soit pas obligatoire d'ajouter une animation de course, celle-ci peut s'avérer plus cohérente et convaincante.
- Aller sur mixamo.com et télécharger une animation de course
- Configurer son rig
- Configurer son clip
- Renommer le clip (ex. :
Course; par défaut, c'estmixamo.com) - Cocher Loop Time, puis Bake Into Pose dans Root Transform Rotation et Root Transform Position (Y)
- Garder Bake Into Pose décoché dans Root Transform Position (XZ) : ce sera géré par le script de déplacement
- Renommer le clip (ex. :
Configurer la machine à états

- Double-cliquer sur
AC_NPCpour l'ouvrir dans le panneau Animator - Onglet Parameters du panneau Animator : + > Bool, le nommer
run - Clic-droit dans la grille, Create State > Empty
- Sélectionner
New Statepuis, dans l'Inspector, le renommer (ex. :Run) et choisir le clip de course dans le champ Motion - Clic-droit sur
Run> Make Transition versWalk, puis deWalkversRun -
Cliquer sur chaque transition (petite flèche blanche) et configurer pour chacune :
Réglage Walk Run Run Walk Has Exit Time décoché décoché Conditions run=truerun=false
Activer la course au PNJ en poursuite¶
- Sélectionner le PNJ dans la Hierarchy
- Dans l'Inspector, sous NPC Follower (Script), cocher Run When Chasing
Ça va activer la course quand le PNJ poursuit sa cible, mais la gestion d'errance reste là lorsque nécessaire.
À l'attaque
¶
Quand le PNJ arrive près de sa cible, on peut s'imaginer qu'il veuille exécuter une action, par exemple, une attaque !
Une attaque corps à corps nécessite une technique qu'on appelle hitbox. C'est une zone de collision temporaire.
Nouvelle animation d'attaque
¶
- Sur mixamo.com , télécharger une animation de coup (ex. : Punch), avec les mêmes réglages que l'animation d'attente
- Configurer son rig
- Configurer son clip :
- Renommer le clip
Attack - Loop Time décoché : le coup ne joue qu'une fois
- Bake Into Pose coché dans les trois sections Root Transform : le PNJ reste sur place pendant le coup
- Renommer le clip
Configurer la machine à états

- Double-cliquer sur
AC_NPC - Onglet Parameters : + > Trigger, le nommer
attack -
Créer un état nommé exactement
Attacket choisir le clip d'attaque dans Motion -
Créer les transitions suivantes :
Réglage Any State Attack Attack Idle Has Exit Time décoché coché Conditions attack(aucune) Can Transition To Self décoché — -
Sur le PNJ, dans NPC Follower :
- Cocher Can Attack
- Attack Trigger =
attack(le même nom que le trigger)
Placer la hitbox¶

- Dans la Hierarchy, à l'intérieur du PNJ, ajouter un Trigger Cube
- Dans Collider Event :
- Required Tags :
Player - After Trigger =
Do Nothing - Actions : l'effet du coup (ex. : Variable pour retirer une vie, Audio pour un son d'impact, etc.)
- Actions, en dernier : Invoke Events, objet = le PNJ, fonction = NPCFollower > HitboxOff
- Required Tags :
Pour les puristes
Si vous tenez à ce que le poing (ou l'épée par exemple) soit le point de contact, vous pouvez placer le Trigger Cube comme enfant d'un membre (ex. : Hand_R).
Utiliser la hitbox dans l'animation !¶
- Dans le panneau Project, sélectionner le FBX de l'animation d'attaque
- Dans l'Inspector, onglet Animation, déplier la section Events
- Dans l'aperçu au bas de l'Inspector, avancer l'animation jusqu'au moment où l'attaque commence
- Cliquer sur Add Event et inscrire
HitboxOndans Function - Avancer jusqu'au moment où l'attaque se termine
- Cliquer sur Add Event et inscrire
HitboxOffdans Function - Laisser vides les champs Float, Int, String et Object, puis cliquer sur Apply

Tester la fenêtre d'impact
Le Contact Radius de NPC Follower (Script) arrête le PNJ pour qu'il ne se superpose pas au joueur. Toutefois, ça peut créer une certaine distance qui empêche la collision d'attaque. Dans ce cas, soit diminuer le Contact Radius, soit agrandir le Trigger Cube d'attaque.
Tourelle¶
Une tourelle est un objet fixe qui tire des projectiles sur une cible.
- Ajouter le script
Turret.csdans 📁 Assets > 📁 _ > 📁 Scripts - Dans la Hierarchy, cliquer sur le + et choisir Create Empty
- Le renommer
Turret - Clic-droit sur
Turretet choisir Create Empty - Le renommer
ShootStart - Dans
Turret, ajouter un modèle (ex. : une tourelle) - Glisser le script
Turret.cssur le GameObjectTurret - Glisser PlayerArmature ou PlayerCapsule dans le champ Target
- Glisser un prefab dans le champ Bullet Prefab
IMPORTANT : ce prefab doit avoir un Rigidbody
- Glisser
ShootStartdans le champ Fire Starting Point
Trello¶

- Semaine 1
- Semaine 2
- Semaine 3
- Semaine 4
- Semaine 5
- Semaine 6
- Semaine 7 | 🏃🏻♂️ Sprint 1 : Prototype
- Semaine 8 | 22 octobre
- Semaine 9 | 29 octobre 🏃🏻♂️ Sprint 2 : Tranche verticale 🗓️ Aujourd'hui
- Semaine 10 | 5 novembre
- Semaine 11 | 12 novembre
- Semaine 12 | 19 novembre 🏃🏻♂️ Sprint 3 : Alpha
- Semaine 13 | 26 novembre
- Semaine 14 | 3 décembre 🏃🏻♂️ Sprint 4 : Beta
- Semaine 15 | 10 décembre 🏃🏻♂️ Sprint 5 : Oral
Version alpha¶
Dans une version alpha, le jeu est structurellement jouable du début à la fin et les mécaniques de base sont implémentées.
Version beta¶
Dans une version beta, le jeu est complet. Le développement se concentre sur les bugs, l'optimisation et l'équilibrage du jeu.
Nouvelles cartes¶
MustTerminer la zone 1, le cas échéant
MustHabiller la zone 2MustÉclairer la zone 2MustSonoriser la zone 2MustPrérequis complet pour la zone 2
MustHabiller la zone 3MustÉclairer la zone 3MustSonoriser la zone 3MustPrérequis complet pour la zone 3
MustMonter la scène Crédits, accessible depuis le menu titre
PNJ¶
CouldPréparer le NavMeshCouldAjouter un ou plusieurs PNJCouldAppliquer la ou les animations des PNJCouldConfigurer le comportement des PNJ