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é.
Défi
MoyenFais en sorte qu’un seul script de saut convienne à la fois au Kid et au Kangaroo.
- Dans
Update(), remplace9fparMathf.Sqrt(jumpHeight * -2f * gravity), la vitesse initiale qui permet de monter exactement dejumpHeight. - Ajoute
&& controller.isGroundedauifdu 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
1Texte à l’écran
Canvas et texteAfficher le scoreFormater les nombresUn compte à reboursRécapitulatif : compteur de vitesse4Scènes et niveaux
Charger une scèneRedémarrer le niveauNiveau suivantConserver entre les scènesRécapitulatif : sélection du niveau2Boutons et écrans
Boutons et onClickLambdasRelier les éléments dans l’InspectorActiver et désactiver les panneauxBarres de santéRécapitulatif : boutique d’améliorations5Sauvegarder avec PlayerPrefs
Enregistrer un nombreCharger avec une valeur par défautMeilleur scoreEnregistrer les paramètresRécapitulatif : les pièces à la banque8Contrôleur de personnage
CharacterController.MoveGravité manuelleSauterPousser des objetsAvancer dans la direction du regardRécapitulatif : double sautEntraînez-vous par vous-même : Playground Unity