Bodenprüfung mit einem Ray
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 37 von 71.
Ein Sprung sollte nur vom Boden aus beginnen. Beim Stehen auf dem Boden wurde das anhand der Kontaktnormalen ermittelt, die durch Kollisionsmeldungen stets aktuell gehalten wurden. Ein Strahl beantwortet direkt und jederzeit die Frage „Stehe ich auf etwas?“: Wirf ihn vom Mittelpunkt aus gerade nach unten, etwas weiter als die Entfernung vom Mittelpunkt bis zum unteren Ende. Dieser Spieler ist eine 2 Einheiten hohe Kapsel, sein unteres Ende liegt also 1 Einheit unter seinem Mittelpunkt, und der Strahl 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 ein wenig in ihn einsinken, sodass ein genau 1 langer Strahl in manchen Frames nichts trifft. Viel länger ist aus dem gegenteiligen Grund falsch: Bei 3 könnte der Spieler schon wieder springen, wenn er 2 Einheiten in der Luft ist, und ohne Länge trifft der Strahl immer den Boden, sodass jeder Tastendruck einen Sprung auslöst.
Der Strahl beginnt innerhalb des eigenen Kolliders des Spielers, den Strahlen überspringen, sodass er den Spieler nie meldet. Die Taste wird in Update() abgefragt, weil GetKeyDown nur einen Frame lang true ist. Ein einmaliger Impuls kann direkt dort hinzugefügt werden, wie bei „Springen mit einem Impuls“.
Aufgabe
MittelLass den Frosch nur vom Boden springen.
- Füge
bool IsGrounded()hinzu, dasPhysics.Raycast(transform.position, Vector3.down, 0.85f)zurückgibt: den Radius des Froschs, 0.75, plus 0.1. - Füge in
Update()&& IsGrounded()zumiffür die Leertaste hinzu.
Drücke „Spielen“ und drücke zweimal die Leertaste: Der Frosch springt einmal. Drücke dann „Prüfen“.
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);
}
}
}
Alle Lektionen in Physik und Gameplay
1Rigidbody
Schwerkraft und MasseMit AddForce schiebenMit einem Impuls springenFixedUpdate für PhysikGeschwindigkeitKinematische KörperRückblick: Startrampe4Coroutinen
AufrufenWiederholt aufrufen, Aufruf abbrechenDeine erste CoroutineSchleifen in CoroutinenCoroutinen beendenRückblick: Countdown10Projekt: Arena-Flucht
Die ArenaJäger2Kollisionen
OnCollisionEnterWas habe ich getroffen?Beim Aufprall zerbrechenAuf dem Boden stehenAbprallen und ReibungCollider-FormenRückblick: Zerstörbare Wand5Projekt: Münzrausch
Der rollende BallMünzen zum Einsammeln11Abschließende Herausforderungen
KanonenreichweiteBewegliche ZieleMurmelgolfIns LochEscape RoomDie TürÜbe selbstständig: Unity-Playground