Menu
CoddyTech

Sauter

Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 39 sur 56.

Un saut consiste en une vitesse verticale définie une seule fois, au moment où la barre d’espace est pressée ; la gravité que le script ajoute déjà ralentit alors la montée, l’arrête au sommet et fait redescendre le contrôleur. Il reste à déterminer la vitesse de départ pour atteindre une hauteur donnée. La gravité réduit la vitesse à un rythme constant, donc un saut qui commence à la vitesse v s’élève de v * v / (2 * g) unités avant de s’arrêter. En inversant la formule, la vitesse de départ pour une hauteur h est v = √(2 * g * h).

Avec gravity stockée comme un nombre négatif, -20, et un saut de 2.5 unités de haut, cela donne Mathf.Sqrt(2.5f * -2f * -20f), la racine carrée de 100 : 10 unités par seconde. Le -2f rend la gravité négative positive, car la racine carrée d’un nombre négatif est NaN :

if (controller.isGrounded && verticalSpeed < 0f)
{
    verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
    verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;

La réinitialisation vérifie verticalSpeed < 0f, donc elle ne met fin qu’aux chutes : une simple réinitialisation if (controller.isGrounded) après la ligne du saut écraserait la vitesse de saut pendant la frame du saut. Le test controller.isGrounded du saut empêche les sauts en plein air. Modifiez jumpHeight ou gravity dans l’Inspector et le saut atteint toujours exactement jumpHeight, tandis qu’une vitesse fixe telle que verticalSpeed = 8f atteint une hauteur différente pour chaque gravité.

challenge icon

Défi

Moyen

Deux sauteurs exécutent le même Jumper.cs : le Kid, dont l’Inspector définit gravity à -18 et jumpHeight à 1, et le Kangaroo, avec gravity à -8 et jumpHeight à 4. La barre d’espace définit verticalSpeed à 9, une valeur trouvée par tâtonnement : elle ne convient à aucun des deux sauteurs, et elle fonctionne aussi en plein air. Corrige le saut :

  • La barre d’espace démarre un saut qui monte exactement de jumpHeight, calculé à partir des valeurs propres à chaque sauteur de jumpHeight et gravity.
  • Seul un sauteur au sol peut sauter.

Appuie sur Play et saute, puis sur Check.

Essayez vous-même

using UnityEngine;

public class Jumper : MonoBehaviour
{
    public float speed = 5f;
    public float gravity = -18f;
    public float jumpHeight = 1f;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        if (Input.GetButtonDown("Jump"))
        {
            verticalSpeed = 9f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}
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 Créer de vrais jeux