Menu
CoddyTech

Vérifier le sol avec un rayon

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

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, donc son bas se trouve 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 ; un rayon de longueur exactement égale à 1 rate donc sa cible pendant certaines images. Une longueur beaucoup plus grande pose le problème inverse : avec 3, le joueur pourrait sauter à nouveau alors qu’il se trouve à 2 unités dans les airs, et sans aucune longueur, le rayon trouve toujours le sol, donc chaque pression déclenche un saut.

Le rayon commence à l’intérieur du collider du joueur, que les rayons ignorent, donc il ne détecte 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 Jump with an Impulse.

challenge icon

Défi

Moyen

La grenouille saute dès que la barre d’espace est pressée, même en plein air, et peut ainsi grimper jusqu’au ciel. Modifie Hopper pour qu’elle ne saute que depuis le sol :

  • Ajoute une méthode bool IsGrounded() qui lance un rayon vertical vers le bas depuis le centre de la grenouille. La grenouille est une sphère mise à l’échelle 1.5, son rayon est donc de 0.75 : fais en sorte que le rayon dépasse de 0.1 le bas de la sphère.
  • Fais-la sauter uniquement lorsque la barre d’espace est pressée et que IsGrounded() est vrai.

Appuie sur Jouer et essaie de sauter deux 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);
        }
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Physique et gameplay