Skip to article frontmatterSkip to article content

Tutoriel 3 : Animation, Collision, Input System et Scripting

IUT d'Orsay, Université Paris-Saclay

Objectifs

Nous allons apprendre à :

Animation

  1. 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).

  2. Découvrez à travers des vidéos l’Animator Component et l’Animator Controller.

  3. Ajoutez la composante Animator à Player.

  4. Créez un répertoire Animations dans Assets.

  5. Dans Assets/Animations, créez un Animator Controller nommé Player et attachez-le à la composante Animator de Player.

  6. 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.

  7. Glissez l’animation Idle dans l’Animator Controller Player. Il doit y avoir un transition de Entry (l’état de départ) vers Idle.

  8. Créez l’animation Running à partir des sprites 19 à 28 du personnage et ajoutez-la à l’Animator Controller.

  9. Dans l’onglet Parameters de Animator, créer un booléen isRunning.

  10. Cliquez droit sur Idle et créez une transition vers Running.

  11. Dans la partie Conditions de la transition, ajoutez la condition isRunning à true pour indiquer que nous devons aller de l’animation Idle à l’animation Running quand le personnage isRunning.

  12. Créez la transition de Running vers Idle et testez les animations en mode Play en cochant et décochant isRunning dans Parameters.

  1. 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.

  2. Créez une animation Climbing à partir des sprites 14 et 15 du personnage.

  3. Ajoutez-la au controller avec un paramètre isClimbing et les bonnes transitions vers Idle.

  4. Vérifiez les animations en cochant et décochant les booléens isRunning et isClimbing dans Parameters.

Prefabs

  1. Découvrez les Prefabs grâce à la vidéo suivante.

  2. Créez des objets simples pour tester les prefabs et ses instances. Supprimez-les ensuite.

  3. 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

  1. Découvrez à travers des vidéos Collider 2D et Rigidbody 2D.

  2. 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.

  3. Changez Body Type dans Rigidbody 2D de Platforms Tilemap à Static pour que les plateformes restent figées dans notre monde.

  4. Ajoutez les composantes Capsule Collider 2D et Rigidbody 2D à Player.

  5. Modifiez Capsule Collider 2D pour que le collider colle bien au sprite de Player.

  6. 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

  1. Dans Window > Package Manager, cherchez Input System dans Unity Registry et installez le package Input System.

  2. Ajoutez la composante Player Input à Player.

  3. 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

  1. Créez le répertoire Scripts dans Assets.

  2. 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.

  3. Regardez les vidéos suivantes sur les bases du scripting en Unity : Scripts as Behavior Components, Awake and Start, Update and FixedUpdate.

  4. Regardez ce diagramme de flots rapidement pour comprendre l’ordre d’exécutions des built-in fonctions d’Unity (par exemple Awake est appelé quand l’objet est initialisé dans la scène et Update est appelé à chaque time frame).

  5. Pour utiliser l’Input System, il faut importer la bibliothèque correspondante avec :

using UnityEngine.InputSystem;
  1. Dans la classe PlayerMovement, créez un attribut Vector2 moveInput dans lequel nous allons stocker les entrées utilisateurs pour le mouvement du personnage. Plus précisément, moveInput va récupérer la valeur de la touche sur laquelle le joueur a appuyé lors de OnMove : droite = (1,0), gauche = (-1,0), haut = (0,1), bas = (0,-1).

  2. Définissez la méthode OnMove dans PlayerMovement comme 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);
}
  1. 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.

  1. Découvrez comment récupérer une composante d’un GameObject avec GetComponent.

  2. Créez un attribut Rigidbody2D myRigidbody2D dans PlayerMovement.

  3. Dans Start, récupérez la composante Rigidbody2D de Player :

myRigidbody2D = GetComponent<Rigidbody2D>();
  1. Créez une méthode void Run qui va être appelé à chaque Update.

  2. Dans Run, nous allons créez Vector2 playerVelocity = new Vector2 (0,0) qui va contenir (vitesse horizontale, vitesse verticale) de Player.

  3. Appliquez cette vitesse à myRigidbody2D avec :

myRigidbody2D.velocity = playerVelocity;

Nous allons juste implémenter la vitesse horizontale de Player pour le moment et ne pas changer sa vitesse verticale.

  1. Gardez toujours la même vitesse verticale (myRigidbody2D.velocity.y) de Player.

  2. Changez la vitesse horizontale avec la valeur moveInput.x.

  3. moveInput.x ne peut prendre que les valeurs -1, 0 et 1 donc pour pouvoir changer la vitesse de Player, nous allons multiplier la valeur de moveInput.x par un attribut float runSpeed que nous pouvons initialiser à 10f.

  4. Pour pouvoir changer runSpeed directement dans Inspector de Player, nous allons le rendre un attribut [SerializeField].

  5. Testez les mouvements horizontaux de Player et jouer avec les valeurs de runSpeed dans Inspector.

  1. Vous pouvez maintenant faire un commit fin du tutoriel 3.