Aller au contenu

Cours 2

Activités sociales

Formulaire à remplir

Commencer un jeu

D'abord, on doit déterminer ce qu'on veut faire avec une planification structurée (on y reviendra un peu plus tard dans la session).

Ensuite, on embarque dans Unity pour faire un mini-prototype. Le but ici est de tester notre boucle de jeu (game loop).

Aujourd'hui, on va passer directement au prototypage. Cela permettra deux choses. D'abord, ça nous familiarisera avec le moteur Unity et de nous donner une certaine confiance pour la suite. Ensuite, ça devrait justifier l'importance de l'étape que nous venons d'omettre 😈

GitHub

Les projets Unity peuvent s'enregistrer sur GitHub. C'est même recommandé de le faire ! Comme ça, pas besoin de trainer de disque dur.

Première chose à faire, se connecter à GitHub !

Ajouter un nouveau projet Unity

Dans Unity Hub,

  1. Dans Projects, cliquez sur « + New Project »
  2. Sélectionnez la version 6 de Unity
  3. Cliquer sur « Universal 3D » (URP)
  4. Choisir un nouveau nom (Project name). Exemple : Protolude
  5. Choisir l'emplacement (Location)
    • Au collège, dans le dossier Documents/Code_Unity idéalement

Là, il y a deux méthodes pour connecter Unity à Github.

Méthode 1 : Source control provider

Avant de créer le projet, on créer une passerelle avec GitHub

  1. Choisir GitHub
  2. Cliquer sur « Get a token »
  3. Confirmer l'accès
  4. Cliquer sur Generate token
  5. Copier le token d'accès dans votre presse papier
  6. Retourner sur Unity Hub
  7. Entrer le token d'acccès et cliquer sur Authorize
  8. Enfin, cliquer sur « + Create project »
  9. Ouvrir l'application GitHub Desktop
  10. Cliquer sur File > Add local repository
  11. Choisir le chemin vers le projet créé et cliquer sur « Add repository »
  12. La fenêtre "Initialize Git LFS" devrait apparaitre. Cliquer sur Initialize Git LFS
  13. Cliquer sur « Publish branch »

Méthode 2 : À l'ancienne 👵

  1. Cliquer sur « + Create project » (sans choisir de source control provider)
  2. Ouvrir l'application GitHub Desktop
  3. Cliquer sur File > Add local repository
  4. Choisir le chemin vers le projet créé et cliquer sur « Add repository »
  5. Une erreur devrait apparaitre. Cliquer sur le lien « create a repository »
  6. La fenêtre « Create a new repository » apparait :
    • Vérifier que le nom est correct
    • Ne touchez pas au chemin, il devrait être normalement bien configuré
    • Ajouter une courte description
    • Cocher "Initialize this repository with a README"
    • Sélectionner Unity dans la liste de "Git ignore"
    • Vous pouvez mettre MIT License pour la "License"
    • Cliquer sur « Create repository »
  7. La fenêtre « Publish repository » apparait.
    • Décocher « Keep this code private »
    • Cliquer sur « Publish repository »

À faire juste une fois par projet

Travailler avec GitHub

La version officielle de votre projet est maintenant celle qui se trouve sur GitHub !

Ctrl+S n'est plus suffisant. À partir de maintenant, pour sauvegarder un projet, il sera essentiel d'effectuer un commit + push. Sinon ça revient à ne pas le sauvegarder du tout.

Si vous voulez travailler sur un autre ordinateur, il faut juste cloner le projet avant de l'ouvrir avec Unity.

Si vous voulez travailler sur un ordinateur qui a deja un clone, mais que la version sur github est plus récente, n'oubliez pas de faire un pull !

Voilà !

Structure de dossiers

À chaque nouveau projet, il sera important de bien classer ses fichiers. Voici la structure recommandée pour le cours :

📁 Assets
 ├── 📁 _
 │    ├── 📁 Animations
 │    ├── 📁 Audio
 │    ├── 📁 Fonts
 │    ├── 📁 Materials
 │    ├── 📁 Prefabs ⭐️ Utile aujourd'hui même
 │    ├── 📁 Scenes 💅 Déplacé ici !
 │    └── 📁 Scripts
 └── ...

Par défaut

Structure ajustée

Dossier Scenes à déplacer

Dans un nouveau projet, le dossier « 📁 Scenes » existe déjà à la racine du dossier « 📁 Assets ». Vous pouvez simplement le déplacer dans votre structure de dossier.

Asset store

Tout ce qui sera importé d'ailleur se positionnera normalement à la racine du dossier « 📁 Assets ». Il sera important de les laisser à cet endroit pour éviter des problèmes plus tard.

Pourquoi _ ?

Séparer les éléments personnalisés du reste.

Le «_» affichera le dossier en premier sous « 📁 Assets ».

GitHub

Notez que les dossiers vides ne sont pas enregistrés dans git.

Démo

Mise en place

  1. Modifier la structure de fichiers

  2. Ajoutez un cube et renommer le « Plancher »

  3. Repositionnez le cube au centre de la scène (x=0, y=0, x=0)
  4. L'aplatissez le pour faire une plateforme (x=10, y=0.1, x=10)

  5. Ajouter un autre cube et renommer le « Pente »

  6. Changer sa dimension/position/échelle pour créer une pente qui donne vers le plancher

Gizmo

Pour voir la caméra et autres éléments importants, activez les options : , puis affichez les Gizmos

Notez qu'on voit maintenant la caméra et la lumière directionnelle (soleil)

Raccourci : F (zoom sur un objet)

Positionner un élément sur une surface

Quand on glisse un élément du panneau Project sur la scène, vous verrez que celui-ci se positionne SUR les surfaces.

Ensuite, le repositionnement ne suit plus cette logique. Sauf si on utilise le raccourci : Ctrl+Shift + drag.

Physique

  • Noter la notion de collider sur le « Plancher »

    Un collider est une carapace invisible qui permet au moteur physique de Unity de détecter les collisions et d'empêcher les objets de se traverser.

  • Ajouter une sphère en haut de la pente
  • Play
  • Stop

    Attention au mode Play

    Lorsque vous effectuez des modifications en mode Play, sachez qu'elles sont temporaire et qu'elles disparaîtront après le Stop.

RigidBody

  • Ajouter un RigidBody à la sphere via Add Component dans le panneau Inspector

    Rigidbody, ça ajoute une masse à un objet et par défaut, ça applique la gravité.

  • Play
  • Stop

Collider

C'est cool les Colliders, mais c'est avec des Rigidbody qu'on en voit l'utilité.

Selon la forme des objets, les colliders changent. Par défaut, une sphère a un collider sphérique.

Pour le fun :

  • Désactiver Sphere Collider de la sphère
  • Ajouter un Box Collider via Add Component
  • Play
  • Stop
  • Remet le Sphere Collider pour la suite

Mesh Renderer

Le Mesh Renderer c'est l'enveloppe, le manteau de la forme. C'est ce qu'on voit au final. Ça utilise ce qu'on appelle un shader pour afficher une surface, mais bon, on y reviendra une fois.

Pourquoi on désactiverait ça ?

Super utile !

On veut parfois limiter le déplacement d'un personnage sans l'afficher explicitement.

Par exemple, une fin de map, ou encore, un pont quand on ne veut pas que le personnage tombe sur les côtés, ce genre de chose.

Ôte-toi de mon soleil !
- Diogène

Mesh Filter

Finalement, le Mesh Filter c'est le squelette géométrique (juste des points et des polygones). C'est un peu l'équivalent des vecteurs d'une image vectorielle.


Exercice - Unity
Isaac Newton

Action / réaction

La base d'une jeu vidéo c'est d'effectuer une action et que cette action a une répercussion. En Web, le classique c'est le lien ou le bouton. On click et il se passe quelque chose.

En jeu vidéo, il y a ça et plus encore. Quand on contrôle un personnage, celui ci interagit avec son environnement. Que ce soit lorsqu'il tire un ennemi ou lorsqu'il tombe dans un trou, une réaction se produit.

En Unity, on parle surtout de collision. Quand le projectif entre en collision avec l'ennemie ou quand le personne tombe dans le trou, il entre en collision avec le trou, il se passe telle ou telle chose.

Collider Event System (CES)

Pour faciliter la gestion des événements liés à des collisions, installons le package Collider Event System.

Dans le panneau Project, glissez un prefab du package sur la scène.

Ex : Packages > Collider Event System > Prefabs > Trigger Cube

  1. Positionnez le à l'endroit où vous voulez effectuer une détection de collision.
  2. Dans le panneau Inspector, sous Collider Event, on peut ajouter un comportement lorsqu'une collision est détectée dans la section Actions :

Les actions possibles sont les suivantes :

Action Effet
Animation Déclenche une animation
Audio Lecture d'une piste audio
GameObject Affiche, cache ou détruit un objet.
Instantiate Prefab Fait apparaitre un prefab
Invoke Events Permet de déclencher un script custom
Material Change l'apparence d'un objet
Rigidbody Retire ou applique la physique sur un objet
Scene Change de scène
Transform Modifie la position, rotation ou l'échelle d'un objet
Variable Assigne une valeur à une variable

Démo | Youtube

Changer l'affichage d'un objet avec CES

Pour activer ou désactiver manuellement un objet dans Unity, on doit simplement cocher ou décocher la case à cocher dans le panneau Inspector.

Toutefois, il est également possible de le faire dynamiquement en programmation, ou avec « Collider Event System ». Voici la marche à suivre pour cette dernière :

  1. Ajouter un prefab du « Collider Event System » sur la scène, de sorte à ce qu'il puisse entrer en collision avec une sphère qui roule.
  2. Dans le panneau Inspector, sous Collider Event, sous Actions, ajouter « Game Object »
  3. Target mode : Specific object
  4. Target : Glisser depuis le panneau Hierarchy un des GameObjects (ex: le plancher)
  5. Operation : laisser à Disable

Désactiver un GameObject actif

Activer un GameObject inactif

Téléporter un objet avec CES

  1. Ajouter un prefab du « Collider Event System » sur la scène, de sorte à ce qu'il puisse entrer en collision avec une sphère qui roule.
  2. Dans le panneau Inspector, sous Collider Event, sous Actions, ajouter « Transform »
  3. Target mode : Entering Objects (les éléments qui entrent en collision avec le CES)
  4. Value Source : Fixed Value
  5. Cocher Position et spécifier des valeurs

Changer la rotation d'un objet avec CES

  1. Ajouter un prefab du « Collider Event System » sur la scène, de sorte à ce qu'il puisse entrer en collision avec une sphère qui roule.
  2. Dans le panneau Inspector, sous Collider Event, sous Actions, ajouter « Transform »
  3. Target mode : Specific object
  4. Target : Glisser depuis le panneau Hierarchy un des GameObjects (ex: Pente)
  5. Value Source : Fixed Value
  6. Cocher Rotation et spécifier des valeurs
  7. Cocher Animate
  8. Duration (en secondes) : 3


Exercice - Unity
Boucle là !

Prefab

Un prefab c'est un objet ou un groupe d'objets qu'on enregistre pour le réutiliser. C'est un modèle sur lequel toutes les copies vont garder une référence.

Le bonhomme de neige

1 bonhomme de neige c'est facile à faire. 3 sphères et hop, c'est fait.

Admettons que je veuille ajouter 10 bonhommes de neige dans mon jeu. Je pourrais le dupliquer 10 fois, mais pas l'idéal. Si ensuite je veux ajouter une carotte pour le nez, je dois le faire pour les 10 ! Il faudrait avoir à le faire une seule fois pour tous les bonhommes. Ça, ça s'appelle faire un prefab.

  • Crééer un gameobject vide, nomme le « bonhomme de neige » et y mettre les 3 sphères.
  • Glisser « bonhomme de neige » dans le panneau Project dans le dossier prefab que vous devirez déjà avoir si vous avez bien fait votre structure de dossiers ;)
  • Supprimer « bonhomme de neige » du panneau Hierarchy
  • Glisser le prefab « bonhomme de neige » sur la scène (on reconnait le prefab par un cube turquoise)
  • Dubliquer le prefab et repositionnez le, 10 fois

Testons l'avantage d'utiliser des prefabs. Ajoutons une carotte pour le nez.

  • Dans le panneau Project, double-clic sur le prefab « bonhomme de neige »
  • Ajouter une carotte pour le nez
  • Sauvegarder et revenir de l'édition en cliquant sur la petite flèche dans le panneau hierarchy

Détacher un prefab

Pour détacher un prefab, clic-droit sur l'objet dans le panneau Hierarchy, puis Prefab > Unpack Completely.

Il n'y aura plus de référence au prefab, donc si on change le prefab, ca ne changera plus cet élément.

SyntyStudio

L'avantage du pack est qu'il contient des centaines de modèles 3D cohérents entre eux. Visuellement, c'est plus sérieux que d'avoir plusieurs assets qui ne partagent pas le même esthétique.

Installation via Asset Store

J'ai pas encore mon compte éducationnel

Si vous ne l'avez pas encore 🤨 vous pouvez le télécharger ici , mais cette solution doit être temporaire.

Conversion nécessaire

Bon, là, si vous ajoutez tout de suite des assets de « SyntyStudio » vous devriez faire face à un problème de Shaders incompatibles. Quand ça arrive, Unity affiche les assets en magenta.

Pas de panique, ça veut juste dire que l'asset utilise un shader qui n'est pas reconnu par la technologie URP (ce sur quoi notre projet est basé). Il faut donc convertir le pack avant de pouvoir l'utiliser :

  1. Clic sur Window > Rendering > Render Pipeline Converter.
  2. Source Pipeline = Built-in
  3. Target Pipeline = Universal Render Pipeline (Universal Renderer)
  4. Coche « Material Reference Converter » et « Material Shader Converter ».
  5. Clic sur le bouton Scan.
  6. Quand c'est terminé, clic sur Convert Assets.

Là, ça fonctionne !

Prototype

Certains materials peuvent être encore brisés. C'est parce que SyntyStudio utilise parfois des shaders personnalisés. Pour corriger cela, dans le panneau Project, tapez "URP_ExtractMe" dans la barre de recherche. Double-cliquez dessus sur l'élément trouvé, puis cliquez sur Import.

Erreur d'inattention

Si vous avez convertis en Universal Render Pipeline (2D Renderer), vous devez soit recommencer, soit appliquer la procédure suivante.

  • Créer un dossier « Editor » dans Assets.
  • Télécharger et déplacer dans le dossier Editor le script de récupération.
  • Sur Unity, vous devriez voir l'onglet "Tools". Cliquer sur URP > 3. Convertir vers URP Lit (tout le projet)

Idée originale de Christophe Granger.

Ajouter des assets sur la scène

  1. Dans le panneau Project, ouvre le dossier SyntyStudios > PolygonAdventure > Prefabs > Environments
  2. Glissez par exemple, SM_Env_Road_Straight_01 sur le panneau Scene.
  3. Repositionnez le prefab au centre de l'environnement (x=0, y=0 et z=0).

Mesh Collider vs Box Collider

Moins le collider est complexe, plus le jeu est performant

Certains modèles 3D incluent par défaut un Mesh Collider. Si son utilisation est pertinente pour des surfaces complexes (comme un terrain) on garde, mais souvent ce n'est pas pertinent.

Mesh Collider est très gourmand en ressources, car le processeur doit calculer les collisions pour chaque polygone.

Devoirs

Vérification du devoir 01 (2 %)

Devoir - Unity
Protolude : Partie 1