Skip to article frontmatterSkip to article content

Tutoriel 4 : Flip Sprite, Animer les mouvements, Layer Collision Matrix, Jump et Physics Material 2D

IUT d'Orsay, Université Paris-Saclay

Objectifs

Nous allons apprendre à :

Flip Sprite

Nous voulons que Player “se tourne” vers la gauche ou la droite selon la direction dans laquelle il bouge. Pour cela, il faut changer Scale (à -1 ou 1 sur l’axe X) dans la composante Transform de Player.

  1. Ajoutez une méthode FlipSprite dans PlayerMovement.cs que nous allons appeler dans Update, après Run.

  2. Dans FlipSprite, pour décider si le sprite doit être flippé, nous allons d’abord vérifier si Player est en mouvement (horizontal) en définissant un booléen bool playerHasHorizontalSpeed.

  3. La valeur de playerHasHorizontalSpeed sera Mathf.Abs(myRigidbody2D.velocity.x) > Mathf.Epsilon qui nous dit que si la valeur absolue de la vitesse sur l’axe x de Player est plus grand que Epsilon (au lieu de 0 car une valeur très petite comme 0.0000001 peut être considérée comme nulle pour éviter des mouvements parfois irréguliers), alors le joueur est en mouvement (horizontal).

  4. Si playerHasHorizontalSpeed est vrai, alors nous allons flipper le sprite de Player en changeant la valeur transform.localScale qui est un vecteur à trois dimensions Vector3. Nous voulons seulement changer la valeur sur l’axe x de transform.localScale donc les valeurs sur l’axe y et z vont rester à 1f. Pour l’axe x, si myRigidbody2D.velocity.x est positif (mouvement vers la droite), alors nous voulons la valeur 1 et -1 sinon. Ceci peut être fait avec Mathf.Sign() qui retourne 1 si l’argument est positif et -1 sinon.

Relier animations et mouvements

Nous voulons que les bonnes animations soit utilisées quand Player fait les movements correspondant.

  1. Récupérez la composante Animator de Player dans PlayerMovement et nommez-la Animator myAnimator.
  1. Dans Run, après le calcul de la vitesse de Player, définissez le booléen bool playerHasHorizontalSpeed et vérifiez si playerHasHorizontalSpeed est vrai comme avant.

  2. Nous pouvons maintenant affectez le booléen isRunning de l’animator à la même valeur grâce à myAnimator.SetBool("isRunning", playerHasHorizontalSpeed).

  3. Testez l’animation des mouvements horizontaux de Player en Play mode.

Layer Collision Matrix

Nous avons défini les users layers pour nos GameObjects pour pouvoir gérer les collisions/interactions entre eux. Plus précisément, ceci est fait grâce à la Layer Collision Matrix.

  1. Dans Edit > Project Settings > Physics 2D > Layer Collision Matrix, tout décochez, puis cochez seulement la collision entre Player et Platforms pour indiquer que seul Player peut interagir avec Platforms pour le moment. Nous pouvons ajouter d’autres interactions dans le futur selon les mécaniques de jeu implémentées.

Jump

  1. Ajoutez une composante Box Collider 2D à Player au niveau des pieds du personnage. Faites attention à ce que la largeur du rectangle ne dépasse pas la largeur du Capsule, sinon le personnage pourrait sauter quand il est contre un mur.
Player Colliders
  1. Récupérez la composante BoxCollider2D dans PlayerMovement.cs comme avant et nommez-la myFeetCollider.

  2. Définissez la méthode isTouchingTheGround de la façon suivante.

bool isTouchingTheGround(){
    return myFeetCollider.IsTouchingLayers(LayerMask.GetMask("Platforms"));
}
  1. Similairement à runSpeed, définissez une variable [SerializeField] float jumpSpeed.

  2. Similairement à OnMove, définissez la méthode OnJump qui prend InputValue value comme argument et ajoute à la vitesse de Player, si Player touche le sole et value.isPressed, un Vector2 sans vitesse horizontale et une vitesse verticale de jumpSpeed.

  3. Pour que les collisions entre Player et le monde soit constamment détecté, changez Collision Detection dans Rigidbody 2D de Player à Continuous au lieu de Discrete.

  1. Changer Gravity Scale dans la composante Rigidbody 2D de Player et jumpSpeed dans l’Inspector pour que le joueur puisse sauter le bon nombre (à vous de choisir) de tiles.

Physics Material 2D

Pour éviter que Player se colle contre les murs, nous allons lui donner une Physics Material 2D sans friction.

  1. Créez un répertoire Materials dans Assets.

  2. Dans Assets/Materials, créez 2D > Physics Material 2D et nommez-le No Friction Material.

  3. Changez Friction et Bounciness à 0 dans No Friction Material et mettez-le dans les Colliders et le Rigidbody de Player.

  4. Testez pour voir que Player ne puisse plus se coller aux murs.

  5. Vous pouvez maintenant faire un commit fin du tutoriel 4 et passer au Quiz 2.