Unity - UFO 2D

Ramasser les pépites d'or

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Cette série explique pas à pas la création d'un jeu 2D dans lequel un vaisseau collecte des pépites d'or.
Vous pouvez retrouver les autres épisodes de cette série dans le sommaire dédié.

II. Vidéo


Unity - UFO 2D - Ramasser les pépites d'or


III. Résumé

Dans cette vidéo, vous allez implémenter le ramassage des pépites d'or.

III-A. Ramasser des objets

Pour permettre au joueur de ramasser les pépites d'or, nous devons détecter lorsque le vaisseau entre en collision avec une pépite. Cette collision doit déclencher une action. Aussi, il est important de vérifier que l'objet en collision est bien une pépite d'or. En effet, les murs sont aussi des objets pouvant entrer en collision avec le joueur.

Dans Unity, des fonctions sont prévues pour être appelées lorsque tel ou tel événement se produit. Dans notre cas, la fonction OnTriggerEnter2D() est appelée lorsque l'objet entre en collision.

Lorsque le joueur entre en collision avec une pépite, nous souhaitons désactiver l'objet de la pépite et ainsi la faire disparaître. Pour cela, nous utilisons la fonction SetActive().

Pour savoir si l'objet en collision est bien une pépite, nous utilisons le système de tags. En effet, toutes les pépites seront marquées de la mention « PickUp » afin de les reconnaître. La fonction CompareTag() permet de savoir si c'est le bon tag.

Voici le script résultant :

PlayerController.cs
Sélectionnez
using UnityEngine;
using System.Collections;

public class CompletePlayerController : MonoBehaviour {

    public float speed;             // Variable à virgule flottante pour sauvegarder la vitesse du joueur
    
    private Rigidbody2D rb2d;       // stocke une référence vers le composant Rigidbody2D nécessaire pour utiliser la physique 2D.

    // Initialisation
    void Start()
    {
        // Récupère et conserve la référence vers le composant Rigidbody2D afin de pouvoir y accéder plus tard.
        rb2d = GetComponent<Rigidbody2D> ();
    }

    // La fonction FixedUpdate() est appelée à intervalle régulier et est indépendante du nombre d'images par seconde. Placez votre code physique ici.
    void FixedUpdate()
    {
        // Stocke l'entrée horizontale dans la variable moveHorizontal.
        float moveHorizontal = Input.GetAxis ("Horizontal");

        // Stocke l'entrée verticale dans la variable moveVertical.
        float moveVertical = Input.GetAxis ("Vertical");

        // Utilise les deux nombres pour créer un Vector2.
        Vector2 movement = new Vector2 (moveHorizontal, moveVertical);

        // Appelle la fonction AddForce() du Rigidbody2D rb2d avec le mouvement multiplié par la vitesse.
        rb2d.AddForce (movement * speed);
    }
    
    // La fonction OnTriggerEnter2D() est appelée chaque fois qu'un objet recouvre le déclencheur.
    void OnTriggerEnter2D(Collider2D other) 
    {
        // Vérifie si le paramètre de la fonction est marqué "PickUp", Si c'est le cas...
        if (other.gameObject.CompareTag("PickUp"))
        {
             other.gameObject.SetActive(false);
        }
    }
}

Pour définir le tag des pépites, vous devez modifier le préfabriqué. Ainsi, toutes les pépites recevront la modification.

Si vous testez le jeu, vous verrez que le vaisseau est en collision avec les pépites, mais que les pépites sont équivalentes à des murs. En effet, le moteur physique calcule les collisions et ne permet pas à deux « Collider » de se traverser. Toutefois, grâce à la propriété « Is Trigger », nous pouvons indiquer au moteur physique que l'objet peut être traversé tout en effectuant les calculs physiques. C'est ce qu'il nous faut pour les pépites.

Même si à ce moment, la collecte des pépites d'or est fonctionnelle, elle n'est pas efficace. En effet, les pépites d'or sont considérées par Unity comme des objets statiques, toutefois, elles sont animées. À cause de ce comportement, Unity doit recalculer la physique de tous les objets statiques, ce qui n'est pas efficace. Si nous rajoutons un « Rigidbody2D » aux pépites d'or, alors Unity sait que l'objet est dynamique. Par contre, cela veut aussi dire que l'objet doit suivre les lois de la physique, telles que la gravité. Pour parer à ce comportement, il faut activer la propriété « Is Kinematic ».

IV. Ressources

Vous pouvez télécharger les ressources pour ce projet sur l'Asset Store de Unity.

V. 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 © 2016 Unity Technologies. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.