IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Unity - Marble Madness 3D

Ramasser des objets

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 :

 
Sélectionnez
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.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2015 Unity Technologies. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.