Menu
CoddyTech

Bodenprüfung mit einem Ray

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 35 von 63.

Ein Sprung sollte nur vom Boden aus beginnen. „Standing on the Ground“ ermittelte das anhand der Kontaktnormalen, die durch Kollisionsmeldungen stets aktuell gehalten wurden. Ein Ray beantwortet direkt vor Ort und jederzeit die Frage „Stehe ich auf etwas?“: Richte ihn vom Mittelpunkt gerade nach unten und mache ihn etwas länger als den Abstand vom Mittelpunkt bis zum unteren Ende. Dieser Spieler ist eine 2 Einheiten hohe Kapsel, ihr unteres Ende liegt also 1 Einheit unter ihrem Mittelpunkt, und der Ray ist 1.1 lang:

public float jumpForce = 5f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}

Die zusätzlichen 0.1 sind ein Spielraum. Ein Körper, der auf dem Boden ruht, kann einen Hauch darüber schweben oder einen Hauch in ihn einsinken, sodass ein Ray mit exakt 1 Länge in manchen Frames nichts trifft. Viel länger ist aus dem gegenteiligen Grund falsch: Bei 3 könnte der Spieler 2 Einheiten über dem Boden erneut springen, und bei einer Länge von 0 findet der Ray immer den Boden, sodass jeder Tastendruck einen Sprung auslöst.

Der Ray beginnt innerhalb des eigenen Colliders des Spielers, den Rays überspringen, sodass er den Spieler nie meldet. Die Taste wird in Update() abgefragt, weil GetKeyDown nur für einen Frame true ist; ein einmaliger Impuls kann genau dort hinzugefügt werden, wie bei „Jump with an Impulse“.

challenge icon

Aufgabe

Mittel

Der Frosch springt immer, wenn die Leertaste gedrückt wird, sogar in der Luft, sodass er in den Himmel klettern kann. Ändere Hopper, sodass er nur vom Boden aus springt:

  • Füge eine Methode bool IsGrounded() hinzu, die vom Mittelpunkt des Frosches aus einen Strahl gerade nach unten wirft. Der Frosch ist eine Kugel mit einer Skalierung von 1.5, sein Radius beträgt also 0.75: Lass den Strahl 0.1 über seinen unteren Rand hinausreichen.
  • Springe nur, wenn die Leertaste gedrückt wird und IsGrounded() true zurückgibt.

Drücke Play und versuche, zweimal zu springen, dann Check.

Probier es selbst

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float jumpForce = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Physik und Gameplay