Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy

Gracz 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 grounded ma 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;
        }
    }
}
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