Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Der 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 grounded wahr 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;
        }
    }
}
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