Kolizje w Unity

Reagowanie na kolidowanie

Piotr Wandycz
Game Dev

Poznałeś/poznałaś już podstawowe komponenty oraz posiadasz zestaw grafik, a także wiesz jak je dostosować do wyświetlania, żeby nie były rozmazane. Dzisiaj będziemy potrzebować dwa obrazki – jeden na obiekt kolizyjny, na który działa grawitacja, oraz jeden na platformę – kolizyjną, ale bez grawitacji. Po wybraniu grafik dostosuj im ustawienia (dla przypomnienia: 32 pixels per unit, filter mode: point, compression: none), a następnie upuść je w hierarchii i ustaw im pozycje tak, aby jeden znalazł się nad drugim.

Do platformy dodaj komponent typu BoxCollider2D. Na scenie powinien zostać obrysowany zieloną obwódką. W taki sposób oznaczane są granice kolizji. Do wisienki dodaj dwa komponenty: Rigidbody2D i CircleCollider2D. Na początek dostosuję nieco za duży collider – poprzez wybranie opcji Edit Coolider i ręczne zmniejszenie zielonego obrysu (powinny pojawić się cztery zielone kropki na obwodzie). Zasada jest następująca: dla obiektów pomagającym graczowi collider może lekko wystawać. Nigdy natomiast nie może być takiej sytuacji przy robieniu wrogów. Tam obszar kolizyjny musi być idealny lub nawet trochę mniejszy niż to, co gracz widzi.

Dobrze byłoby też zablokować rotacje w osi Z. Na dzisiejsze demo nie ma to żadnego wpływu, ale warto wyrabiać sobie nawyk. W grach 2D, przy rzucie kamery z boku, przeważnie nie chcemy mieć zaznaczonej tej opcji, żeby uniknąć dziwnych zachowań.

Od strony praktycznej to już wszystko – możemy kliknąć Play i zobaczyć, że wisienka spada na platformę i zatrzymuje się na niej. Chciałbym jeszcze dodać nieco teorii w skrypcie – jak wykrywać i reagować na kolizje?

Dodajmy do wisienki nowy skrypt o nazwie CherryCollisions. Następnie otwórzmy skrypt w Visual Studio. Usuńmy utworzone metody Start i Update – nie będą one potrzebne. Jeśli mamy zainstalowane wsparcie dla Unity, to dostaniemy podpowiedzi w trakcie pisania kodu – jakich wbudowanych metod możemy użyć. Jeśli nie – zawsze można skorzystać z tej strony.

Główne metody to OnCollisionEnter, OnCollisionStay i OnCollisionExit. Posiadają wersję dla wariantu 2D oraz dla trigerrów (np. OnTriggerEnter2D). Zawsze pozwalam Visual Studio na uzupełnienie reszty metody, bądź kopiuję ją z Intenetu, gdyż różnią się przyjmowanym parametrem, a jeśli popełnimy błąd – metoda się nie wywoła. Uzupełnijmy trochę ciało tej metody – wypisując logi do konsoli, a jeśli obiektem kolidującym z wisienką byłby gracz – dodalibyśmy mu punkty oraz zniszczylibyśmy obiekt wisienki. Destroy to metoda wbudowana w Unity (MonoBehaviour) usuwająca obiekt ze sceny.

using UnityEngine;

public class CherryCollisions : MonoBehaviour
{
    private void OnCollisionEnter2D(Collision2D collision)
    {
        Debug.Log($"I am {gameObject.name}");
        Debug.Log($"Collided with: {collision.gameObject.name}");

        if(collision.gameObject.tag == "Player")
        {
            // TODO: add points to player
            Destroy(gameObject);
        }
    }
}

Otrzymujemy tu proste, ale bardzo potężne narzędzie. W tej metodzie wiemy, co z nami koliduje (collision.gameObject), oraz wiemy, kim jesteśmy (gameObject). Jako że gameObject to podstawowa jednostka w Unity – możemy sprawdzić jego nazwę, tag, czy wartswę. Możemy też zmienić coś w dowolnym z jego komponentów używając funkcji gameObject.GetComponent<>(), czy nawet zareagować poprzez wyszukanie obiektu zupełnie niezwiązanego z nimi i wywołać na nim odpowiednią funkcję.

W następnym wpisie z tego cyklu prawdopodobnie zajmiemy się obsługą sterowania gracza, a kolizje powrócą w przyszłości przy okazji warstw i macierzy kolizji.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *