Springen
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 40 von 60.
Ein Sprung ist eine vertikale Geschwindigkeit, die einmalig im Moment des Drückens der Leertaste festgelegt 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 noch festgelegt werden muss, 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, um v * v / (2 * g) Einheiten, bevor er zum Stillstand kommt. Umgestellt ergibt sich für eine Höhe h die Startgeschwindigkeit v = √(2 * g * h).
Wenn gravity als negative Zahl, -20, gespeichert ist 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 Zurücksetzung prüft verticalSpeed < 0f, beendet also nur Stürze: Eine einfache Zurücksetzung mit if (controller.isGrounded) nach der Sprungzeile würde die Sprunggeschwindigkeit im Sprungrame ü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; eine feste Geschwindigkeit wie verticalSpeed = 8f führt dagegen bei jeder Schwerkraft zu einer anderen Höhe.
Aufgabe
MittelMit einem Sprungskript sowohl den Kid als auch den Kangaroo passend springen lassen.
- Ersetze in
Update()9fdurchMathf.Sqrt(jumpHeight * -2f * gravity), die Anfangsgeschwindigkeit, mit der die Figur genaujumpHeightweit nach oben steigt. - Füge
&& controller.isGroundedzumiffür den Sprung hinzu, damit in der Luft kein Sprung möglich ist.
Drücke auf „Spielen“ und dann die Leertaste: Der Kid steigt 1 Einheit hoch und der Kangaroo 4. Drücke dann auf „Prüfen“.
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);
}
}
Alle Lektionen in Echte Spiele entwickeln
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer2Buttons 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Übe selbstständig: Unity-Playground