Springen
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 39 von 56.
Ein Sprung ist eine vertikale Geschwindigkeit, die einmalig in dem Moment festgelegt wird, in dem die Leertaste gedrückt wird; die Schwerkraft, die das Skript bereits hinzufügt, verlangsamt dann den Aufstieg, stoppt ihn am höchsten Punkt und bringt den Controller wieder nach unten. Was bleibt, ist die Startgeschwindigkeit für eine bestimmte Höhe. Die Schwerkraft verringert die Geschwindigkeit gleichmäßig, daher steigt ein Sprung, der mit der Geschwindigkeit v beginnt, v * v / (2 * g) Einheiten hoch, bevor er zum Stillstand kommt. Umgestellt ergibt sich für die Starthöhe h die Startgeschwindigkeit v = √(2 * g * h).
Wenn gravity als negative Zahl gespeichert ist, nämlich -20, und der Sprung 2.5 Einheiten hoch sein soll, ergibt sich Mathf.Sqrt(2.5f * -2f * -20f), die Quadratwurzel aus 100: 10 Einheiten pro Sekunde. Das -2f macht die negative Schwerkraft positiv, denn die Quadratwurzel einer negativen Zahl ist NaN:
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;Die Rücksetzung prüft verticalSpeed < 0f, sodass sie nur Stürze beendet: Eine einfache Rücksetzung mit if (controller.isGrounded) nach der Sprungzeile würde die Sprunggeschwindigkeit im Sprungr-Frame überschreiben. Die Prüfung controller.isGrounded beim Sprung verhindert Sprünge in der Luft. Ändere jumpHeight oder gravity im Inspector, und der Sprung erreicht weiterhin genau jumpHeight, während eine feste Geschwindigkeit wie verticalSpeed = 8f bei jeder Schwerkraft eine andere Höhe erreicht.
Aufgabe
MittelZwei Springer führen dasselbe Jumper.cs aus: das Kind, dessen Inspector gravity auf -18 und jumpHeight auf 1 setzt, und das Känguru mit gravity -8 und jumpHeight 4. Die Leertaste setzt verticalSpeed auf 9, eine durch Ausprobieren ermittelte Zahl: Sie passt zu keinem der beiden Springer und funktioniert auch in der Luft. Behebe den Sprung:
- Die Leertaste startet einen Sprung, der genau um
jumpHeightansteigt, berechnet anhand des jeweiligenjumpHeightundgravitydes Springers. - Nur ein Springer am Boden kann springen.
Drücke Play und springe, dann Check.
Probier es selbst
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);
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Echte Spiele entwickeln
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer4Szenen und Level
Eine Szene ladenDas Level neu startenNächstes LevelZwischen Szenen beibehaltenRückblick: Levelauswahl10Projekt: 3D-Plattformer
Der ParcoursBewegliche Plattformen2Buttons und Bildschirme
Buttons und onClickLambdasVerknüpfungen im InspectorPanels ein- und ausblendenGesundheitsbalkenRückblick: Upgrade-Shop5Speichern mit PlayerPrefs
Eine Zahl speichernMit einem Standardwert ladenHöchstpunktzahlEinstellungen speichernRückblick: Münzen auf der Bank