Menu
CoddyTech

Sauter

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

Un saut est une vitesse verticale définie une seule fois, au moment où la barre d’espace est enfoncée ; la gravité que le script ajoute déjà ralentit alors la montée, l’arrête au sommet et ramène le contrôleur vers le bas. Il reste à déterminer la vitesse initiale pour 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 initiale pour une hauteur h est v = √(2 * g * h).

Avec gravity stockée sous la forme d’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 avec if (controller.isGrounded) après la ligne du saut écraserait la vitesse du saut pendant la frame où il a lieu. Le test controller.isGrounded du saut empêche les sauts en plein air. Modifie jumpHeight ou gravity dans l’Inspector : le saut atteint toujours exactement jumpHeight, tandis qu’une vitesse fixe telle que verticalSpeed = 8f atteint une hauteur différente selon la gravité.

challenge icon

Défi

Moyen

Fais en sorte qu’un seul script de saut convienne à la fois au Kid et au Kangaroo.

  1. Dans Update(), remplace 9f par Mathf.Sqrt(jumpHeight * -2f * gravity), la vitesse initiale qui permet de monter exactement de jumpHeight.
  2. Ajoute && controller.isGrounded au if du saut, afin qu’il n’y ait pas de saut en plein air.

Appuie sur « Jouer » et sur la barre d’espace : le Kid monte de 1 unité et le Kangaroo de 4. Puis clique sur « Vérifier ».

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);
    }
}

Toutes les leçons de Créer de vrais jeux

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