Tutoriel 5 : Collider Trigger, Kinematic Body Type
Objectifs¶
Dans ce tutoriel, nous allons apprendre à utiliser un Trigger dans un Collider.
Tests
Il ne faut pas oublier de tester régulièrement les nouvelles fonctionnalités dans le Play mode et sortir du Play mode quand vous avez besoin de modifier des paramètres du jeu.
Climb¶
Dans l’Inspector de
Tiles/Platforms/tiles_102qui correspond à une échelle, cliquez sur Sprite Editor, zoomez sur le sprite de la tile correspondante, choisissez Custom Physics Shape, puis Generate dans Outline Tool, supprimez le petit rectangle au centre et recadrez le carré qui couvre tout le sprite pour ne couvrir que le milieu de l’échelle.
Nous venons d’éditer la forme de la collision de l’objet. Ainsi, quand le joueur va grimper sur l’échelle, il doit être au milieu de l’échelle au lieu de pouvoir grimper simplement en touchant le bord.
Faites de même pour les tiles 101 et 103 si vous voulez les utiliser.
Créez la Ladders Tilemap avec des échelles en ajoutant les tiles des échelles à votre palette puis créez les bonnes layers associés.
Ajoutez les Tilemap Collider 2D et Composite Collider 2D à Ladders Tilemap.
Changez Body Type dans Rigidbody 2D à Static, cochez Is Trigger dans Composite Collider 2D et choisissez Composite Operation > Merge dans Tilemap Collider 2D.
Modifiez la Layer Collision Matrix pour que la User Layer de Ladders Tilemap ne puisse qu’interagir qu’avec le Player.
Récupérez
CapsuleCollider2D myBodyColliderdansPlayerMovement.cs.Implémentez
bool isTouchingALadder().Ajoutez la méthode
void ClimbLadderque nous allons appeler à la fin duUpdate.Ajoutez un attribut
float climbSpeedet imitez le code deRunpour implémentez une première version deClimbLadder().
Pour régler le problème de la gravité, nous allons changer la gravité de Player à 0 quand il est sur une échelle avec
myRigidbody2D.gravityScale = 0f.Il faut remettre la bonne gravité quand Player ne touche plus l’échelle donc définissez un attribut
float gravityScaleAtStartet récupérez la valeur demyRigidbody2D.gravityScaledansStart.Quand Player ne touche plus l’échelle, il faut remettre
myRigidbody2D.gravityScaleàgravityScaleAtStart.
Réglez le premier problème en ajoutant une ligne de code dans
else.Réglez le deuxième problème en modifiant la condition de
setBooldansif.
Enemy¶
Utilisez ce que vous avez appris pour créer l’Enemy grenouille (sprites
enemies_21,enemies_22,enemies_23) dans la scène (sauvegardé en tant que prefab) avec les bonnes layers, les bonnes interactions dans la Layer Collision Matrix, un sprite, une seule animation, un Capsule Collider 2D (avec l’option Is Trigger) et un Rigidbody 2D (avec Kinematic comme Body Type).
Dans
Assets/Scripts, créezEnemyMovement.csdans lequel nous allons définir[SerializeField] float moveSpeedet récupérer la composanteRigidbody2D myRigidbody2D.Dans
Update, modifiez la vitesse horizontale dansmyRigidbody2DavecmoveSpeed.
Nous devons maintenant permettre à Enemy de faire des allers-retours. Pour cela, nous allons ajouter un champ de vision à Enemy, qui sera un Box Trigger. Dès qu’il ne “voit” plus Platforms, il fera demi-tour.
Créer un Box Collider 2D avec Is Trigger devant Enemy qui descend un peu dans le sol.
Ajoutez
OnTriggerExit2D(Collider2D other)dansEnemyMovement.csqui changemoveSpeeden-moveSpeedpour que Enemy se déplace dans l’autre direction.Ajoutez aussi une fonction
FlipEnemyFacingqui changelocalScalede Enemy pour que le sprite tourne aussi dans la bonne direction.