Szybkie tworzenie poziomów 2D

Ostatnio znalazłem dość proste i szybkie rozwiązanie do tworzenia map. Może przydać się na różnego rodzaju game jam’y, albo po prostu do małych gier. Polega ono na utworzeniu obrazka, w którym każdy kolor piksela reprezentuje konkretny typ obiektu do utworzenia. Kiedyś używałem map tekstowych, jednak mają one jedną wadę – są dużo cięższe do rysowania. Dużo lepiej wygląda zielona kreska, niż ciąg liter.

Wyjątek: jeśli piszemy grę, która generuje losowe poziomy – lepiej będzie wykorzystać mapę tekstową.

Obiekty występujące na poniższym rysunku:

  • gracz
  • ziemia
  • platforma, która spada po 5 sekundach
  • moneta o nominale 5zł
  • wróg
  • i tak dalej…

Przedstawione rozwiązanie jest dobre, jeśli nasze obiekty mają wielkość dokładnie 1 jednostki. W innym przypadku pozycjonowanie prefabów robi się problematyczne. Przykład: platforma ma szerokość 5 jednostek. Wtedy zajmie dodatkowo 2 kratki w prawo i w lewo. Jeśli liczba jest parzysta, to dopiero robi się cyrk.

Jeśli użyjemy specjalnego folderu StreamingAssets, damy możliwość edycji map osobom nieposiadającym Unity. Wystarczy że użytkownik zapisze mapkę w Streaming Assets i będzie ona dostępna w grze, bez konieczności przekompilowania aplikacji. Otwiera to nam drogę do napisania prostego edytora. Do dyspozycji mamy 256^4 kolorów, które w edytorze mogą być reprezentowane przez normalne obiekty. Bez tego może być ciężko zauważyć różnicę, np. między Color32(255,0,0,255) a Color32(254,0,0,255).

Przykładowa implementacja w Unity3D

Będziemy potrzebować kolekcji, która mapuje kolory na ścieżki prefab’ów:

Oraz takich, które wczytają obrazek i zainicjują obiekty: