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”.
Wyzwanie
ŚredniPozwól żabie skakać tylko z ziemi.
- Dodaj
bool IsGrounded(), która zwracaPhysics.Raycast(transform.position, Vector3.down, 0.85f): promień żaby, 0.75, plus 0.1. - W
Update()dodaj&& IsGrounded()do instrukcjiifobsł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
1Ciało sztywne
Grawitacja i masaPopychanie za pomocą AddForceSkok z impulsemFixedUpdate dla fizykiPrędkośćCiała kinematycznePowtórka: platforma startowa4Korutyny
WywoływanieInvokeRepeating i CancelInvokeTwoja pierwsza korutynaPętle w korutynachZatrzymywanie korutynPodsumowanie: odliczanie10Projekt: Ucieczka z areny
ArenaŁowcy2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur5Projekt: Wyścig po monety
Tocząca się piłkaZbieranie monet3Wyzwalacze
Kolizje wyzwalająceOnTriggerEnterPrzedmioty do zebraniaSkrzynie zatrzymują resztęStrefy śmierciWejście i wyjściePodsumowanie: klucz i drzwi6Raycasty
Physics.RaycastRaycastHitSprawdzanie podłoża za pomocą promieniaWarstwy i LayerMaskLinia widzeniaOverlapSphere i SphereCastPodsumowanie: laserowa barieraPoćwicz samodzielnie: Edytor online Unity