Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach
  1. Füge public float jumpHeight = 1.6f;, public float gravity = -40f; und private float fallSpeed; zu Runner hinzu.
  2. Lies nach den Spur-Tasten die Sprungtasten (W, Up, Space) aus und springe nur, wenn controller.isGrounded.
  3. Füge vor targetX die beiden oben genannten Gravitationszeilen hinzu.
  4. 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