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“.
Aufgabe
MittelDer 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);
}
}
}
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
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand