Menu
CoddyTech

Sprawdzanie podłoża za pomocą promienia

Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 35 z 63.

Skok powinien rozpoczynać się tylko z podłoża. W przypadku metody Standing on the Ground ustalano to na podstawie normalnych kontaktu, aktualizowanych przez komunikaty o kolizjach. Promień odpowiada na pytanie „czy stoję na czymś?” natychmiast, w dowolnym momencie: wyślij go pionowo w dół ze środka, na nieco większą odległość niż odległość od środka do dołu. Ten gracz ma kapsułę o wysokości 2 jednostek, więc jej dół znajduje się 1 jednostkę poniżej środka, a promień ma długość 1.1:

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);
}

Dodatkowe 0.1 to margines. Obiekt spoczywający na podłodze może znajdować się odrobinę nad nią lub odrobinę w nią wnikać, więc promień o długości dokładnie 1 w niektórych klatkach nie trafia w podłogę. Znacznie większa długość jest błędna z drugiej strony: przy długości 3 gracz mógłby ponownie skoczyć 2 jednostki nad ziemią, a przy zerowej długości promień zawsze trafia w podłogę, więc każde naciśnięcie powoduje skok.

Promień zaczyna się wewnątrz własnego collidera gracza, który promienie pomijają, więc nigdy nie wykrywa gracza. Klawisz jest odczytywany w Update(), ponieważ GetKeyDown ma wartość true tylko przez jedną klatkę, a pojedynczy impuls można dodać właśnie tam, jak w przykładzie Jump with an Impulse.

challenge icon

Wyzwanie

Średni

Żaba skacze za każdym razem, gdy naciśniesz spację, nawet w powietrzu, więc może wspiąć się w niebo. Popraw Hopper, aby skakał tylko z ziemi:

  • Dodaj metodę bool IsGrounded(), która rzuca promień pionowo w dół od środka żaby. Żaba jest sferą o skali 1.5, więc jej promień wynosi 0.75: promień powinien sięgać 0.1 poza jej dolną krawędź.
  • Skacz tylko wtedy, gdy naciśnięta jest spacja i IsGrounded() zwraca true.

Naciśnij Graj i spróbuj skoczyć dwa razy, a następnie naciśnij Sprawdź.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Fizyka i rozgrywka