Menu
CoddyTech

Sprawdzanie podłoża za pomocą promienia

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

Skok powinien rozpoczynać się tylko z podłoża. W lekcji „Stanie na podłożu” ustalaliśmy to na podstawie normalnych kontaktu, aktualizowanych przez komunikaty o kolizjach. Promień odpowiada na miejscu, w dowolnym momencie, na pytanie „czy stoję na czymś?”: wystrzel go prosto w dół ze środka, na odległość nieco większą niż odległość od środka do dołu. Ten gracz jest 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. Ciało spoczywające na podłodze może znajdować się odrobinę nad nią albo nieco się w nią zagłębiać, więc promień o długości dokładnie 1 w niektórych klatkach nie trafi. Znacznie większa długość powoduje odwrotny problem: 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 kolidera gracza, które promienie pomijają, więc nigdy nie zgłasza gracza. Klawisz jest odczytywany w Update(), ponieważ GetKeyDown ma wartość true tylko przez jedną klatkę, a pojedynczy impuls można dodać właśnie w tym miejscu, tak jak w lekcji „Skok z impulsem”.

challenge icon

Wyzwanie

Średni

Pozwól żabie skakać tylko z ziemi.

  1. Dodaj bool IsGrounded(), która zwraca Physics.Raycast(transform.position, Vector3.down, 0.85f): promień żaby, 0.75, plus 0.1.
  2. W Update() dodaj && IsGrounded() do instrukcji if obsługującej spację.

Naciśnij „Graj” i naciśnij dwukrotnie spację: żaba skacze raz. 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);
        }
    }
}

Wszystkie lekcje w sekcji Fizyka i rozgrywka

Poćwicz samodzielnie: Edytor online Unity