Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

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 et les layers Player associées et ajoutez un Sprite Renderer avec le sprite characters_3 qui va représenter notre personnage. Vous n’êtes pas obligé d’utiliser le même personnage. Si vous choisissez un autre personnage, n’oubliez pas d’utiliser les sprites correspondant à votre personnage dans la suite.

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

  3. Ajoutez la composante Animator à Player.

  4. Créez les répertoires Animations et Animations/Player dans Assets.

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

  6. Choisissez les sprites characters_2 et characters_3 en même temps puis créez une Animation Clip que nous allons appeler Idle (quand le personnage ne bouge pas). Cocher Loop Time pour que l’animation se répète infiniment.

  7. Mettez l’animation dans Assets/Animations/Player.

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

  9. Testez l’animation en mode Play. Vous pouvez changer la vitesse de l’animation dans l’Inspector de l’état Idle de l’Animator Controller.

  10. Créez l’animation Running de la même façon à partir des sprites 4 à 8 du personnage et ajoutez-la à l’Animator Controller.

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

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

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

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

  15. Créez l’animation Climbing de la même façon à partir des sprites 0 et 1 du personnage.

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

  17. 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 les composantes Collider 2D et Rigidbody 2D à travers ces vidéos : Collider 2D et Rigidbody 2D.

  2. Ajoutez Tilemap Collider 2D et Composite Collider 2D à Platforms Tilemap puis choisissez 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 à la tête et au corps du sprite de Player (au lieu des bras et des jambes).

  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. Créez le répertoire Input System dans Assets.

  2. Dans Window > Package Management > Package Manager, vérifiez que le package Input System est bien présent. Sinon, installez-le depuis Unity Registry.

  3. Ajoutez la composante Player Input à Player.

  4. Un Input Action Asset est utilisé par défaut. Bougez-le vers Assets/Input System et faites une copie de l’asset et renommez-le Player.

  5. Utilisez l’Input Action Asset Player dans Actions de la composante Player Input.

  6. Suivez le tutoriel Customizing New Input Actions. Pour le moment, nous avons juste besoin de Move 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 MonoBehaviour Script PlayerMovement et glissez-le vers le bouton Add Component de 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.