I. Sommaire▲
Vous pouvez retrouver les autres épisodes de cette série dans le sommaire dédié.
II. Vidéo▲
Unity - Marble Madness 3D - Ramasser des objets
III. Résumé▲
Maintenant que nous avons des objets à collectionner, nous voulons faire en sorte qu'ils soient ramassés lors du passage de la balle.
III-A. Ramasser des objets▲
Pour ramasser un objet, il faut que la balle soit en contact avec l'objet à collectionner. Pour cela, nous devons détecter la collision entre les deux objets. Dans Unity, tous les objets (la balle, le sol, les objets à collectionner…) possèdent un « Collider » qui nous informe sur les collisions.
Sans les collisions, la balle traverserait le sol et tomberait à l'infini.
III-A-1. Script du joueur▲
Afin de pouvoir ramasser des objets, nous devons modifier le script du joueur. Pour atteindre notre but, nous nous intéressons au composant « Sphere Collider » du joueur pour lequel vous pouvez consulter la documentation ici et la page pour le scripting ici.
Pour détecter la collision, nous allons utiliser la fonction OnTriggerEvent(), qui sera appelée par Unity au moment où la collision se produit.
Si une collision se produit, nous devons vérifier deux choses :
- si l'objet en collision avec le joueur est un objet à collectionner. Pour cela, nous utiliserons le système de tags ;
- si la condition ci-dessus est remplie, nous désactivons l'élément.
Voici le code du joueur, mis à jour pour remplir cette tâche :
using
UnityEngine;
using
System.
Collections;
public
class
PlayerController :
MonoBehaviour {
public
float
speed;
private
Rigidbody rb;
void
Start (
)
{
rb =
GetComponent<
Rigidbody>(
);
}
void
FixedUpdate (
)
{
float
moveHorizontal =
Input.
GetAxis (
"Horizontal"
);
float
moveVertical =
Input.
GetAxis (
"Vertical"
);
Vector3 movement =
new
Vector3 (
moveHorizontal,
0
.
0f
,
moveVertical);
rb.
AddForce (
movement *
speed);
}
void
OnTriggerEnter
(
Collider other)
{
if
(
other.
gameObject.
CompareTag (
"Pick Up"
))
{
other.
gameObject.
SetActive (
false
);
}
}
}
Finalement, pour que le code fonctionne, il est nécessaire de taguer les objets à collectionner.
Pour cela, ajoutez un tag, appliquez-le au préfabriqué des objets à collectionner. Ce changement sera répercuté à tous les éléments héritant du préfabriqué.
III-B. Les collisions▲
Si nous testons le jeu, cela ne fonctionnera pas. La balle va rebondir contre les objets à collectionner.
Dans Unity, le moteur physique ne permet pas le recouvrement entre deux volumes physiques « Colliders ». Lorsque cela arrive, le moteur va calculer une collision à partir de leur forme et de leur vitesse. Une collision entraine un rebond.
Toutefois, il est possible d'indiquer que la pénétration entre deux volumes est permise. Les calculs des volumes physiques sont toujours présents, seule la conséquence physique (la collision et donc, le rebond) n'est plus prise en compte. Pour cela, on passe le « Collider » en mode déclencheur « Trigger ».
Pour ce faire, il suffit de sélectionner le préfabriqué des objets à collectionner et, dans le composant « Box Collider », de cocher « Is Trigger ».
III-C. Optimisation▲
Pour optimiser les calculs du moteur physique, Unity va mettre en cache les volumes physiques statiques. En effet, les volumes statiques ne sont pas censés bouger. Dans notre cas, notre script les fait tourner, provoquant le recalcul de ce cache à chaque image.
Unity considère un élément « statique », s'il possède un « Collider », mais pas de « Rigid Body ». Pour rendre nos objets à collectionner des éléments dynamiques, il suffit de rajouter un composant « Rigid Body ».
Toutefois, le fait d'ajouter un composant « Rigid Body » fait que l'objet est maintenant soumis à la gravité. Nos objets à collectionner tombent. Pour supprimer ce comportement, il faut cocher « Is Kinematic » du composant « Rigid Body ». Un objet cinématique ne réagit pas aux forces physiques.
IV. Commenter▲
Vous pouvez commenter et donner vos avis dans la discussion associée sur le forum.