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 et les layers
Playerassociées et ajoutez un Sprite Renderer avec le spritecharacters_3qui 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.Découvrez à travers des vidéos l’Animator Component et l’Animator Controller.
Ajoutez la composante Animator à Player.
Créez les répertoires
AnimationsetAnimations/PlayerdansAssets.Dans
Assets/Animations/Player, créez un Animator Controller nomméPlayeret attachez-le à la composante Animator de Player.Choisissez les sprites
characters_2etcharacters_3en même temps puis créez une Animation Clip que nous allons appelerIdle(quand le personnage ne bouge pas). Cocher Loop Time pour que l’animation se répète infiniment.Mettez l’animation dans
Assets/Animations/Player.Glissez l’animation
Idledans l’Animator ControllerPlayer. Il doit y avoir un transition de Entry (l’état de départ) vers Idle.Testez l’animation en mode Play. Vous pouvez changer la vitesse de l’animation dans l’Inspector de l’état
Idlede l’Animator Controller.Créez l’animation
Runningde la même façon à partir des sprites 4 à 8 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.Créez l’animation Climbing de la même façon à partir des sprites 0 et 1 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 les composantes Collider 2D et Rigidbody 2D à travers ces vidéos : Collider 2D et Rigidbody 2D.
Ajoutez Tilemap Collider 2D et Composite Collider 2D à Platforms Tilemap puis choisissez 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 à la tête et au corps du sprite de Player (au lieu des bras et des jambes).
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¶
Créez le répertoire
Input SystemdansAssets.Dans Window > Package Management > Package Manager, vérifiez que le package Input System est bien présent. Sinon, installez-le depuis Unity Registry.
Ajoutez la composante Player Input à Player.
Un Input Action Asset est utilisé par défaut. Bougez-le vers
Assets/Input Systemet faites une copie de l’asset et renommez-lePlayer.Utilisez l’Input Action Asset
Playerdans Actions de la composante Player Input.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¶
Créez le répertoire
ScriptsdansAssets.Dans
Assets/Scripts, créez un MonoBehaviour ScriptPlayerMovementet glissez-le vers le bouton Add Component de 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.