Nie, to nie jest tytuł jakieś tandetnej powieści 😉

Często w grach, np. typu „endless runer” wiele elementów świata generowanych jest losowo, tylko po to, aby pojawiły się na ekranie na kilka sekund. Gracz przebiega, przeskakuje przeszkodę czy wroga i zostawia ich za sobą, poza zasięgiem widzenia. Te obiekty, mimo, że już ich nie widać, nie są automatycznie niszczone. Im dłużej trwa gra, tym więcej ich przybywa i tym bardziej obciążony zostaje RAM urządzenia, na którym uruchomiona jest gra. Żeby temu zapobiec, tworzy się tak zwany „garbage collector” – obiekt, który możemy wykorzystać do zniszczenia, tego, czego gracz już nie zobaczy.

Zrobienie czegoś takiego jest proste:

  1. Dodajemy pusty obiekt do sceny (możemy go nazwać ‚GarbageCollector’)
  2. Do obiektu dodajemy komponent BoxCollider2D
  3. Ustawiamy pożądany rozmiar collidera i zaznaczamy opcję ‚Is Trigger’
  4. Dodajemy kolejny komponent, nowy skrypt C#
  5. W skrypcie usuwamy standardowo dodawane metody Start oraz Update i dodajemy nową:
void OnTriggerEnter2D(Collider2D col) {
    Destroy (col.gameObject);
}

To wszystko

Proces tworzenia, a także samo działanie „śmieciarza” zobrazowałem na poniższym filmie.

Przy implementacji tego mechanizmu musimy również wziąć pod uwagę, że różne rodzaje obiektów i colliderów mogą się wzajemnie „nie wykrywać”. Tabelkę takich zależności można znaleźć w oficjalnej dokumentacji Unity (na dole strony).

W przypadku, który przedstawiłem na filmie, zakładam, że zniszczeniu będą ulegać obiekty, które pod wpływem grawitacji spadły poniżej pola widzenia kamery. Jednak równie dobrze, można by ustawić go tak, by podążał za graczem biegnącym w lewo/prawo i zamiatał to co zostało zostawione w tyle.