Stanie na podłożu
Część sekcji Fizyka i rozgrywka ścieżki Unity w Coddy. Lekcja 11 z 63.
Każdy kontakt ma normalną: kierunek o długości 1, prostopadły do dotkniętej powierzchni, skierowany od niej w stronę twojego obiektu. collision.GetContact(0) to pierwszy punkt kontaktu, a jego normal informuje, której strony dotknąłeś. Stojąc na płaskim podłożu, ma wartość (0, 1, 0); przy ścianie po prawej stronie ma wartość (-1, 0, 0); uderzając głową w sufit, ma wartość (0, -1, 0).
Ta skrzynia rozróżnia lądowanie od uderzenia w bok:
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);
}
}Warunek sprawdza normal.y > 0.5f, a nie dokładnie 1, dzięki czemu za podłoże uznawane są także pochyłości: na pochyłości o kącie 60 stopni wartość y wynosi 0.5, a jest ona bardziej stroma niż każda pochyłość, po której da się wejść. Dwa kolejne komunikaty przydają się w przypadku zdarzeń, które trwają: OnCollisionStay uruchamia się przy każdym kroku fizyki, dopóki trwa kontakt, a OnCollisionExit — raz, gdy kontakt się kończy. Zdarzenie zakończenia kontaktu nie ma punktów kontaktu, ponieważ nic już się nie styka, więc nie wywołuj wtedy GetContact.
Wyzwanie
ŁatwyGracz może chodzić i skakać, ale Spacja działa również w powietrzu, więc może wspinać się ku niebu, skacząc raz za razem, i odbić się od boku ściany. (Jego collider ma materiał bez tarcia, więc zsuwa się po ścianach zamiast się do nich przyklejać.) Skacz tylko wtedy, gdy gracz stoi na czymś.
- Utrzymuj wartość
bool grounded: true, gdy gracz dotyka czegoś, czego normalna kontaktu jest skierowana w górę (y powyżej 0.5), i false, gdy przestaje tego dotykać. - Skacz tylko wtedy, gdy naciśnięto Spację i
groundedma wartość true. Naciśnięcie w powietrzu jest ignorowane, a nie zapamiętywane do lądowania.
Naciśnij Play, spróbuj skoczyć dwa razy i wspiąć się na ścianę, a następnie naciśnij Check.
Spróbuj swoich sił
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;
}
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
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 startowa2Kolizje
OnCollisionEnterW co uderzyłem?Rozbijanie przy zderzeniuStanie na podłożuOdbicie i tarcieKształty colliderówPodsumowanie: Zniszczalny mur