Unity - Contrôleur pour personnage d'un jeu de plateformes

Détecter les recouvrements

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 contrôleur pour le mouvement d'un personnage dans un jeu de plateformes 2D.
Vous pouvez retrouver les autres épisodes de cette série dans le sommaire dédié.

II. Vidéo


Unity - Contrôleur pour personnage d'un jeu de plateformes - Détecter les recouvrements


III. Résumé

Dans l'épisode précédent, la caisse traverse le sol. Dans ce tutoriel, vous allez apprendre comment détecter les collisions afin d'éviter ce comportement.

III-A. Détection des recouvrements

Lorsqu'une collision est détectée, la vélocité de l'objet doit être modifiée afin d'arrêter son mouvement. Dans notre cas, nous souhaitons n'appliquer la collision que si la distance sur laquelle se déplace l'objet est plus grande qu'un seuil déterminé. De cette façon, nous évitons la vérification des collisions pour les objets qui ne se déplacent plus.

La distance est calculée en utilisant la magnitude de la vélocité :

 
Sélectionnez
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PhysicsObject : MonoBehaviour {

    public float gravityModifier = 1f;

    protected Rigidbody2D rb2d;
    protected Vector2 velocity;
    protected ContactFilter2D contactFilter;
    protected RaycastHit2D[] hitBuffer = new RaycastHit2D[16];

    protected const float minMoveDistance = 0.001f;
    protected const float shellRadius = 0.01f;

    void OnEnable()
    {
        rb2d = GetComponent<Rigidbody2D> ();
    }

    void Start () 
    {
        contactFilter.useTriggers = false;
        contactFilter.SetLayerMask (Physics2D.GetLayerCollisionMask (gameObject.layer));
        contactFilter.useLayerMask = true;
    }
    
    void Update () 
    {

    }

    void FixedUpdate()
    {
        velocity += gravityModifier * Physics2D.gravity * Time.deltaTime;

        Vector2 deltaPosition = velocity * Time.deltaTime;

        Vector2 move = Vector2.up * deltaPosition.y;

        Movement (move);
    }

    void Movement(Vector2 move)
    {
        float distance = move.magnitude;

        if (distance > minMoveDistance) 
        {
            int count = rb2d.Cast (move, contactFilter, hitBuffer, distance + shellRadius);
        }

        rb2d.position = rb2d.position + move;
    }

}

La fonction RigidBody2D.Cast() permet de détecter si l'objet actuel va entrer en collision avec un autre objet de la scène. De plus, un « ContactFilter2D » est utilisé pour diminuer le nombre de collisions à vérifier grâce au mécanisme des calques (« layers »).
Lors de l'utilisation de la fonction Cast(), la distance est légèrement augmentée pour empêcher que l'objet ne soit bloqué dans le composant avec lequel il entre en collision.

Pour le moment, le script n'est pas utilisable tel quel. En effet, nous n'avons pas écrit le code modifiant la vélocité de l'objet selon les collisions détectées.

IV. Ressources

Vous pouvez télécharger les ressources pour ce projet ici.

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 © 2017 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.