Gérer les collisions en Godot 4 et C#

Ma Motivation 💪
72%

Aujourd’hui je vais apprendre à gérer les collisions entre deux objets.

Nouvelle Scène

Prenons un noeud RigidBody. Il a besoin d’un mesh (MeshInstance3D) et d’un collider (CollisionShape3D). Pour rappel, RigidBody3D permet de rendre un objet éligible aux lois de la physique en lui donnant une masse, une gravité, etc.

Si nous mettons un RigidBody et que nous jouons la scène, il tombera à cause de la gravité. Pour contrer cela, nous devons modifier la valeur Gravity Scale de RigidBody3D.

Par défaut, la gravité est configurée à 9.8 dans Godot. La valeur Gravity Scale équivaut par combien on va multiplier la gravité. Si nous mettons une gravité nulle, le cube ne tombera pas.

paramètre Gravity Scale

Détecter les collisions avec Area3D

Pour détecter une collision, je vais utiliser le noeud Area3D. Il permet de créer une zone qui détecte tous les objets qui s’y trouvent. Nous pouvons donc facilement nous permettre de faire une action pour retirer des points de vie par exemple.

Area3D a besoin d’un collider comme noeud enfant. Dans mon cas, je vais utiliser CollisionShape3D. Ici, le noeud collisionShaphe3D permet de définir la taille de la zone de l’area3D.

Je vais faire une sphère avec le noeud RigidBody3D et noeud Area3D. Mon objectif est de détecter la collision entre un cube et la sphère. Mon cube est aussi un RigidBody3D. Nous allons reprendre le code présent dans l’article précédent où nous avions appris à déplacer facilement un cube.

Arborescence de la scène sphère

Area3D détecte plusieurs types d’objets à l’aide de signaux, mais je vais principalement me servir de deux d’entre eux :

L’objectif est que la sphère détecte une collision avec le cube. Le cube étant un RigidBody3D (donc un Node3D), nous allons nous servir du signal body_entered.

Pour savoir quel objet entre en collision avec notre sphère, nous devons utiliser la constante de Node3D .Name .

private void _on_area_3d_body_entered(Node3D body)
{
	GD.Print(body.Name);
}

Une fois le jeu lancé, le terminal affiche ceci :

résultat terminal

Quand on lance le jeu, on remarque que la sphère est en collision avec elle-même, ce qui est tout à fait normal. La zone Aread3D englobe la sphère. Notre code affiche les noms de tous les objets de type Node3D qui entrent en collision avec la zone. La sphère étant dans la zone et elle-même étant un RigidBody, elle est donc détectée et apparaît sur le terminal.

Libérer de la Mémoire

En développement de jeu, il est possible de faire disparaître un objet de différentes manières. Soit en déplaçant l’objet tellement loin que la caméra ne pourra pas l’afficher, soit en le désactivant ce qui signifie le rendre invisible ou tout simplement en le supprimant définitivement.

Pour supprimer définitivement en élément, il faut utiliser QueueFree();. Supprimer un objet permet de libérer des ressources de l’ordinateur. Si l’on déplaçait les objets en dehors du champ de vision de la caméra, les performances du jeu et du pc diminueraient.

Voici un bout de code qui supprime la sphère si le cube entre dans Area3D. 

private void _on_area_3d_body_entered(Node3D body)
{
	if(body.Name == "Cube")
	{
		QueueFree();
      }
}

 

Nous avons vu comment gérer les collisions en Godot et C#.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut