[[Développement Unity]] # Ramasser la pièce On a une pièce dans notre scène, mais quand on joue au jeu on a ça : ![[coin.gif]] On passe à travers la pièce. Nous, on veut ramasser la pièce. Pour commencer, il faudrait que mon joueur rentre en **collision** avec la pièce. Si je clique sur mon GameObject **Player**, je vois qu'il a un Component dans l'inspector qui s'appelle **Capsule Collider**. ![[Code et Développement/Développement d'Applications/Développement Unity/ressources/image.png]] Représenté par la capsule verte dans le modèle 3D de mon Player : ![[Code et Développement/Développement d'Applications/Développement Unity/ressources/image (1).png]] Collider = Collisionneur en français ! Mais alors si mon joueur un Component qui lui permet de rentrer en collision avec un autre objet, pourquoi il rentre pas en collision avec ma pièce ? Parce que si on veut que 2 objets rentrent en collision, il faut qu'ils aient **tous les deux** un collider. Il faut donc en ajouter un à notre pièce. Pour ça on va cliquer sur notre pièce, dans la hiérarchie ou dans la scène, et aller dans l'inspector et faire : **Add Component >** taper **collider** > **Box Collider**. ![[colliderbox.gif]] Vérifier que le collider ressemble à ça : (Lignes vertes) ![[Code et Développement/Développement d'Applications/Développement Unity/ressources/image (2).png]] Si ce n'est pas le cas, modifier le collider en cliquant ici et bouger les points qui apparaissent au milieu des faces. ![[Code et Développement/Développement d'Applications/Développement Unity/ressources/image (3).png]] ![[collidersize.gif]] Qu'est-ce que ça fait maintenant ? ![[collide.gif]] Mon joueur se retrouve bloqué par la pièce. C'est pas non plus ce qu'on veut, on veut qu'il ramasse la pièce. Pour ça on va faire de la programmation en C#. Commençons par créer notre script. Dans le dossier **Scripts** > **clic droit** > **Create** > **Scripting** > **MonoBehaviour Script**. Nommez ce script **CollectingCoins** et double cliquer dessus pour l'ouvrir. ![[createscript.gif]] Voici ce que Visual Studio ouvre : ![[Capture décran 2025-05-20 142940 (1).png]] C'est la base d'un MonoBehaviour, un type de classe qui est le plus utilisé pour développer sur Unity. Elle permet d'être mise en tant que Component d'un GameObject. Regardons ce qu'il y a dedans : ```csharp void Start() { } ``` Ici, on met tout ce qui doit être fait **1 seule fois** au moment de la première frame du jeu. ```csharp void Update() { } ``` Ici, on met tout ce qui doit fait à **chaque frame**. Tant qu'on parle de frame, on va faire une petite parenthèse sur ce qu'est une frame avec une vidéo du game designer du premier Kirby, Masahiro Sakurai : <iframe width="560" height="315" src="https://www.youtube.com/embed/Rjdmi7628GM?si=xXDRnM5pGKb1mk_r" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> La vidéo nous dit que si notre jeu tourne à 60FPS, l'**Update** sera lu **60 fois par seconde**, alors si on vérifie dans l'update que notre joueur est rentré en collision avec notre pièce, ça va être trop lourd. Pour ça on va utiliser une fonction qui est appelée à chaque collision, et on va envoyer un message dans la console pour voir si les collisions sont biens détectées. La fonction est toujours déclarée **dans** la class : ```csharp private void OnCollisionEnter(Collision collision) { Debug.Log("Collision !"); } ``` **Ctrl + S** et on retourne sur Unity, pour drag and drop notre script dans l'inspector de notre player. ![[dropScript.gif]] Maintenant lorsqu'on lance le jeu et que l'on regarde la console quand on rentre en collision avec la pièce, il la détecte. En revanche, si on saute, lorsqu'on retombe, il détecte aussi une collision car le sol aussi a un collider. ![[collide (1).gif]] Il faut différencier la collision avec une pièce des autres. Pour ça, dans la fonction précédemment créée, il faut ajouter une condition qui va aller regarder les tags des GameObjects avec lesquels le joueur entre en collision. ```csharp private void OnCollisionEnter(Collision collision) { //Si mon player rentre en collision avec un collider alors... if (collision.gameObject.CompareTag("Coin")) { Debug.Log("Collison avec la pièce"); } } ``` **Ctrl + S** Si on démarre le jeu maintenant, il y a cette erreur : ![[Capture décran 2025-05-20 151235.png]] Nous n'avons pas défini le tag **Coin** sur notre pièce. Pour le faire je vais dans l'inspector de ma pièce, dans la partie Tag : **Untagged > Add Tag > + > New Tag Name : Coin > Retourner sur ma pièce > Untagged > Coin**. Attention a bien mettre le même nom dans le script et dans les tags de Unity ! Quand on démarre le jeu et qu'on rentre en collision avec la pièce, la console nous renvoie ce message : ![[coincollide (1).gif]] Maintenant, il faudrait détruire la pièce et incrémenter un **integer** (entier) pour comptabiliser les pièces collectées tout au long du niveau. On retourne sur notre script où nous allons déclarer, avant les fonctions, notre integer : ```csharp public int coinsCollected; ``` Maintenant on peut l'appeler et l'incrémenter dans notre condition créée précédemment. On va aussi modifier notre message de debug pour afficher le nombre de pièces collectées : ```csharp private void OnCollisionEnter(Collision collision) { //Si mon player rentre en collision avec un collider alors... if (collision.gameObject.CompareTag("Coin")) { //... j'ajoute +1 à mon int coinsCollected++; Debug.Log(coinsCollected); } } ``` **Ctrl + S** Maintenant la console nous revoie le nombre de pièces collectées. ![[coincollected.gif]] En revanche, je peux rentrer en collision plusieurs fois avec la même pièce et ça incrémente mon nombre de pièces collectées. On va détruire la pièce dès que le joueur rentre en collision avec celle-ci. On retourne dans notre fonction pour ajouter la ligne qui nous permet de détruire la pièce après avoir incrémenté notre integer : ```csharp //Je détruis ma pièce en récupérant le gameObject du collider qui est rentré en collision avec mon player Destroy(collision.gameObject); ``` **Ctrl + S** Maintenant, notre pièce se détruit à la collision : ![[coincollecteddestroy.gif]] **Ctrl + S** [[09. Jouer un son quand le joueur ramasse la pièce]] ---