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é.
Défi
MoyenDeux 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 dejumpHeightetgravity. - 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);
}
}
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
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 niveau7Contrôle du temps
Mettre en pause avec timeScaleRalentiTemps non mis à l’échelleRécapitulatif : Bullet Time10Projet : jeu de plateforme en 3D
Le parcoursPlateformes mobiles2Boutons 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 saut