Mapa kafelkowa w Unity3D

Mapa kafelkowa to najprostszy sposób na tworzenie poziomów w grach 2D. Mamy do dyspozycji określony zestaw grafik, którymi rysujemy plansze. Jeśli potrzebujemy wykorzystać większy obiekt – składamy go z wielu „kafelków”. Dwa lata temu Unity zaprezentowało kilka udogodnień do budowania światów 2D. Miesiące mijały, a ze strony firmy była cisza. Aż do lipcowej wersji 2017.1 wprowadzającej m.in. Sprite Atlas i Sprite Mask. W październiku (2017.2) pojawiło się 2D Tilemap i życie stało się prostsze. Istnieje co prawda Tiled2Unity, ale jest strasznie toporny. Eksportował mi setki obiektów do hierarchii, z których każdy miał podpięty collider. Wydaje mi się, że jest to mocno niewydajne, a poza tym robi się syf w hierarchii.

Aby posłużyć się mapą należy dodać nowy 2D Object -> Tilemap. Tak jak dowolny element UI musi znajdować się na Canvas – tak kontenerem dla Tilemap jest Grid. Zostanie on utworzony automatycznie. Posiada on właściwość Cell Size mówiącą o proporcji rysowanego kafelka do jednostek Unity. Najlepiej trzymać to w stosunku 1 do 1.

Tilemap przychodzi z dwoma komponentami: Tilemap i Tilemap Renderer. O ile ten pierwszy ma dla podstawowych zastosowań małe znaczenie, to ten drugi może okazać się dość pomocny. Zwłaszcza właściwość Sorting Layer, która mówi o kolejności rysowania warstw w grach 2D. Dużo osób używa do tego celu Order in Layer, który powinien być stosowany wyłącznie do kolejności wewnątrz warstwy. W Gridzie może obok siebie znajdować się kilka Tilemap, np. jedna odpowiedzialna za tło, druga za pierwszy plan i trzecia za detale rysowane na pierwszym planie.

Potrzebne jeszcze będzie nowe okienko, znajdujące się w Window -> Tile Palette. Teraz trzeba kliknąć w Create New Palette i nadać jej nazwę. Na niej umieszczamy grafiki pojedynczych kafelków, oraz komponujemy je w większe elementy. W prosty sposób możemy zaznaczać po kilka kafelków i nanosić całe obiekty na mapę. Trzymając Shift podczas rysowania usuwamy kafelki. Mamy do dyspozycji także narzędzie wypełnienia. Dwie ważne rzeczy: Active Tilemap wskazuje mapę na którą nanoszoną będą grafiki, Ground to nazwa mojej palety.

Kafelki można programować, aby uzyskać na nich animacje, automatycznie dopasować sąsiadów, albo wprowadzić losowość. Fajnie widać to na początku tego filmiku. Mając narysowany poziom wystarczy dodać Tilemap Collider 2D do obiektu Tilemap. Automatycznie zostaną obrysowane wszystkie kafelki.

Dodając Composite Collider 2D możemy ograniczyć ilość linii kolizji wyłącznie do granic obiektów. Do Tilemap zostanie automatycznie dodane Rigidbody 2D, które jest wymagane przez Composite Collider 2D, ale mi w ogóle nie potrzebne. Najprościej jest zmienić jego Body Type na Static. Checkbox Simulated też powinien zostać odznaczony, o czym zapomniałem zanim zrobiłem screenshot. Czy jest to poprawne rozwiązanie? Nie wiem. Czy działa? Działa.

Na samym dole obrazka widać dropdown Focus On. Jest on przydatny mając kilka warstw, bo wyszarza te nieaktywne.