Menu
CoddyTech

Vérifier le sol avec un rayon

Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 37 sur 71.

Un saut ne devrait commencer que depuis le sol. Standing on the Ground déterminait cela à partir des normales de contact, mises à jour par les messages de collision. Un rayon répond sur-le-champ, à tout moment, à la question « suis-je debout sur quelque chose ? » : lance-le droit vers le bas depuis le centre, avec une longueur légèrement supérieure à la distance entre le centre et le bas. Ce joueur est une capsule de 2 unités de haut : son bas se trouve donc 1 unité sous son centre, et le rayon mesure 1.1 :

public float jumpForce = 5f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}

Les 0.1 supplémentaires constituent une marge. Un corps au repos sur le sol peut se trouver un tout petit peu au-dessus ou s’enfoncer un tout petit peu dedans, donc un rayon de longueur exactement égale à 1 ne détecte pas le sol sur certaines images. Une longueur beaucoup plus grande pose le problème inverse : avec 3, le joueur pourrait sauter de nouveau alors qu’il est à 2 unités dans les airs, et avec une longueur nulle, le rayon trouve toujours le sol, donc chaque pression déclenche un saut.

Le rayon commence à l’intérieur du propre collider du joueur, que les rayons ignorent : il ne signale donc jamais le joueur. La touche est lue dans Update(), car GetKeyDown n’est vrai que pendant une seule image, et une impulsion ponctuelle peut être ajoutée directement à cet endroit, comme dans « Sauter avec une impulsion ».

challenge icon

Défi

Moyen

Fais sauter la grenouille uniquement depuis le sol.

  1. Ajoute bool IsGrounded() qui renvoie Physics.Raycast(transform.position, Vector3.down, 0.85f) : le rayon de la grenouille, 0.75, plus 0.1.
  2. Dans Update(), ajoute && IsGrounded() au if sur Space.

Appuie sur « Jouer » et appuie deux fois sur Space : la grenouille saute une fois. Puis clique sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float jumpForce = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}

Toutes les leçons de Physique et gameplay

Entraînez-vous par vous-même : Playground Unity