Auf dem Boden stehen
Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 11 von 63.
Jeder Kontakt hat eine Normale: eine Richtung der Länge 1, die senkrecht auf der berührten Oberfläche steht und von ihr weg auf dein Objekt zeigt. collision.GetContact(0) ist der erste Kontaktpunkt, und seine normal verrät dir, welche Seite du berührt hast. Auf flachem Boden ist sie (0, 1, 0); an einer Wand rechts von dir ist sie (-1, 0, 0); wenn du mit dem Kopf an eine Decke stößt, ist sie (0, -1, 0).
Diese Kiste unterscheidet Landungen von seitlichen Stößen:
void OnCollisionEnter(Collision collision)
{
Vector3 normal = collision.GetContact(0).normal;
if (normal.y > 0.5f)
{
Debug.Log("Landed on " + collision.gameObject.name);
}
else
{
Debug.Log("Bumped the side of " + collision.gameObject.name);
}
}Der Test lautet normal.y > 0.5f statt genau 1, damit auch Steigungen als Boden zählen: Auf einer 60-Grad-Steigung beträgt y 0.5; sie ist steiler, als jemand hinaufgehen würde. Zwei weitere Meldungen helfen bei allem, was länger andauert: OnCollisionStay wird bei jedem Physikschritt ausgeführt, solange der Kontakt besteht, und OnCollisionExit einmal, wenn er endet. Bei einem Exit gibt es keine Kontaktpunkte, da nichts mehr berührt wird. Rufe dort also nicht GetContact auf.
Aufgabe
EinfachDer Spieler kann laufen und springen, aber die Leertaste funktioniert auch in der Luft. So kann er mit jedem Sprung ein Stück höher in den Himmel klettern und von der Seite der Wand abspringen. (Der Collider hat ein reibungsfreies Material, sodass er an Wänden hinunterrutscht, anstatt daran haften zu bleiben.) Lass ihn nur springen, wenn er auf etwas steht.
- Verwende ein
bool grounded: wahr, solange der Spieler etwas berührt, dessen Kontaktnormale nach oben zeigt (y über 0.5), und falsch, sobald er den Kontakt verliert. - Springe nur, wenn die Leertaste gedrückt wurde und
groundedwahr ist. Ein Tastendruck in der Luft wird ignoriert und nicht für die Landung gespeichert.
Drücke Play, versuche zweimal zu springen und die Wand hinaufzuklettern, und klicke dann auf Check.
Probier es selbst
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float speed = 4f;
public float jump = 6f;
private Rigidbody rb;
private bool jumpPressed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpPressed = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
if (jumpPressed)
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
jumpPressed = false;
}
}
}
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