Tutoriel 3 : Animation, Collision, Input System et Scripting
Objectifs¶
Nous allons apprendre à :
- créer des animations,
- comprendre la physique de collision,
- utiliser l’Input System, et
- les bases de la programmation C# dans Unity.
Animation¶
Créez un objet Player avec les bonnes layers et ajouter un Sprite Renderer avec un sprite du personnage (par exemple le 5ème sprite).
Découvrez à travers des vidéos l’Animator Component et l’Animator Controller.
Ajoutez la composante Animator à Player.
Créez un répertoire
AnimationsdansAssets.Dans
Assets/Animations, créez un Animator Controller nomméPlayeret attachez-le à la composante Animator de Player.Choisissez les sprites 5, 6, 7 et 8 du personnage en même temps puis créez une Animation que nous allons appeler Idle (quand le personnage ne bouge pas). Cocher Loop Time pour que l’animation se répète infiniment.
Glissez l’animation Idle dans l’Animator Controller
Player. Il doit y avoir un transition de Entry (l’état de départ) vers Idle.Créez l’animation Running à partir des sprites 19 à 28 du personnage et ajoutez-la à l’Animator Controller.
Dans l’onglet Parameters de Animator, créer un booléen
isRunning.Cliquez droit sur Idle et créez une transition vers Running.
Dans la partie Conditions de la transition, ajoutez la condition
isRunningàtruepour indiquer que nous devons aller de l’animation Idle à l’animation Running quand le personnageisRunning.Créez la transition de Running vers Idle et testez les animations en mode Play en cochant et décochant
isRunningdans Parameters.
Transition settings
Les settings d’une transition permet de faire du blending de deux animations (rendre le passage d’une animation vers une autre plus naturel).
Vous pouvez jouer avec ces settings et observer les changements dans les animations. Des settings simples quand nous n’avons pas besoin de faire de blending est de tout mettre à 0 et décocher Has Exit Time.
Quand vous cliquez sur un état dans l’Animator Controller, vous pouvez jouer avec Speed dans Inspector pour facilement changer la vitesse de l’animation de l’état.
Créez une animation Climbing à partir des sprites 14 et 15 du personnage.
Ajoutez-la au controller avec un paramètre
isClimbinget les bonnes transitions vers Idle.Vérifiez les animations en cochant et décochant les booléens
isRunningetisClimbingdans Parameters.
Prefabs¶
Découvrez les Prefabs grâce à la vidéo suivante.
Créez des objets simples pour tester les prefabs et ses instances. Supprimez-les ensuite.
Sauvegardez notre objet Player comme Prefab dans un nouveau répertoire
Assets/Prefabs. Nous allons modifier ce prefab de player dans la suite (pas juste l’instance de Player dans cette scène).
Collision¶
Découvrez à travers des vidéos Collider 2D et Rigidbody 2D.
Ajoutez Tilemap Collider 2D et Composite Collider 2D à Platforms Tilemap puis cochez Used by Composite dans Tilemap Collider 2D pour avoir un seul collider pour les plateformes. Dans la dernière version, c’est Composite Operation > Merge dans Tilemap Collider 2D.
Changez Body Type dans Rigidbody 2D de Platforms Tilemap à Static pour que les plateformes restent figées dans notre monde.
Ajoutez les composantes Capsule Collider 2D et Rigidbody 2D à Player.
Modifiez Capsule Collider 2D pour que le collider colle bien au sprite de Player.
Dans la composante Rigidbody 2D > Constraints de Player, cochez Freeze Rotation Z pour que le personnage ne puisse pas tomber vers l’avant (ou l’arrière).
Input System¶
Dans Window > Package Manager, cherchez Input System dans Unity Registry et installez le package Input System.
Ajoutez la composante Player Input à Player.
Cliquez sur Create Actions et créez InputActions (à enregistrer dans
Assets/Input System) puis suivez le tutoriel Customizing New Input Actions. Pour ce jeu, nous avons juste besoin de Move, Fire, et Jump avec des contrôles à travers des touches de clavier.
Scripting¶
Créez le répertoire
ScriptsdansAssets.Dans
Assets/Scripts, créez un script PlayerMovement et glissez-le vers l’Inspector de Player pour l’ajouter en tant que composante de Player.Regardez les vidéos suivantes sur les bases du scripting en Unity : Scripts as Behavior Components, Awake and Start, Update and FixedUpdate.
Regardez ce diagramme de flots rapidement pour comprendre l’ordre d’exécutions des built-in fonctions d’Unity (par exemple
Awakeest appelé quand l’objet est initialisé dans la scène etUpdateest appelé à chaque time frame).Pour utiliser l’Input System, il faut importer la bibliothèque correspondante avec :
using UnityEngine.InputSystem;Dans la classe
PlayerMovement, créez un attributVector2 moveInputdans lequel nous allons stocker les entrées utilisateurs pour le mouvement du personnage. Plus précisément,moveInputva récupérer la valeur de la touche sur laquelle le joueur a appuyé lors deOnMove: droite = (1,0), gauche = (-1,0), haut = (0,1), bas = (0,-1).Définissez la méthode
OnMovedansPlayerMovementcomme suit. Cette méthode sera appelée lorsque le joueur appuie sur une touche de mouvement.
void OnMove(InputValue value){
moveInput = value.Get<Vector2>();
Debug.Log(moveInput);
}- Testez les entrées utilisateurs de mouvement de Player en regardant les sorties dans la console. Vous pouvez supprimer
Debug.Log(moveInput)ensuite.
Pour faire bouger le personnage, nous aurons besoin d’appliquer des forces physiques à sa composante Rigidbody 2D.
Découvrez comment récupérer une composante d’un GameObject avec
GetComponent.Créez un attribut
Rigidbody2D myRigidbody2DdansPlayerMovement.Dans
Start, récupérez la composante Rigidbody2D de Player :
myRigidbody2D = GetComponent<Rigidbody2D>();Créez une méthode
void Runqui va être appelé à chaqueUpdate.Dans
Run, nous allons créezVector2 playerVelocity = new Vector2 (0,0)qui va contenir (vitesse horizontale, vitesse verticale) de Player.Appliquez cette vitesse à
myRigidbody2Davec :
myRigidbody2D.velocity = playerVelocity;Nous allons juste implémenter la vitesse horizontale de Player pour le moment et ne pas changer sa vitesse verticale.
Gardez toujours la même vitesse verticale (
myRigidbody2D.velocity.y) de Player.Changez la vitesse horizontale avec la valeur
moveInput.x.moveInput.xne peut prendre que les valeurs -1, 0 et 1 donc pour pouvoir changer la vitesse de Player, nous allons multiplier la valeur demoveInput.xpar un attributfloat runSpeedque nous pouvons initialiser à10f.Pour pouvoir changer
runSpeeddirectement dans Inspector de Player, nous allons le rendre un attribut[SerializeField].Testez les mouvements horizontaux de Player et jouer avec les valeurs de
runSpeeddans Inspector.
- Vous pouvez maintenant faire un commit
fin du tutoriel 3.