Springen
Lektion 3 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.
Als Nächstes springt der Läufer. Ein CharacterController hat keine eigene Schwerkraft: Dein Skript hält eine vertikale Geschwindigkeit vor und bewegt sich in jedem Frame entsprechend dieser Geschwindigkeit.
Die Schwerkraft ändert diese Geschwindigkeit in jedem Frame. Wenn der Läufer auf dem Boden steht (controller.isGrounded), behalte eine kleine Abwärtsgeschwindigkeit von -2 bei, damit er auf die Straße gedrückt bleibt:
if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
fallSpeed += gravity * Time.deltaTime;Um unter der Schwerkraft g eine Höhe h zu erreichen, beginnt ein Sprung mit der Geschwindigkeit Mathf.Sqrt(h * -2f * g). Bei einer Sprunghöhe von 1.6 und einer starken Schwerkraft von -40 springt der Läufer hoch und kommt schnell wieder herunter. Das passt zu einem Spiel, in dem Dinge auf dich zukommen:
bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
if (jump && controller.isGrounded)
{
fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}Die Bewegung hat jetzt auch einen y-Anteil: fallSpeed * Time.deltaTime.
Aufgabe
Einfach- Füge
public float jumpHeight = 1.6f;,public float gravity = -40f;undprivate float fallSpeed;zuRunnerhinzu. - Lies nach den Spur-Tasten die Sprungtasten (W, Up, Space) aus und springe nur, wenn
controller.isGrounded. - Füge vor
targetXdie beiden oben genannten Gravitationszeilen hinzu. - Erzeuge die Bewegung mit
new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f).
Probier es selbst
using UnityEngine;
public class Runner : MonoBehaviour
{
public float laneWidth = 2.5f;
public float laneSpeed = 16f;
public int lane;
private CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
float targetX = lane * laneWidth;
float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
Vector3 move = new Vector3(x - transform.position.x, 0f, 0f);
controller.Move(move);
}
}
Alle Lektionen in Unity-Spiel: Himmelsbahnen
Übe selbstständig: Unity-Playground