Tilemaps 2D

Elemente componente

  1. Grid: componenta de tip canvas, in care se pot adauga tilemap-uri
  2. Tilemap: obiectul in care se vor adauga tile-urile
  3. Tilemap Renderer: componenta care controleaza cum se deseneaza tile-urile
  4. Tile Palette: asset ce defineste o colectie de tile-urile ce ar putea fi folosite
  5. Tile: asset ce poate contine un Sprite, o culoare sau un colider

Tile-urile pot fi scriptate astfel incat sa se creeze comportamente personalizate, spre exemplu in functie de vecini sau pozitia tile-ului.

Palette

Pentru a utiliza tilemaps, in primul rand trebuie definita o paleta folosind utilitarul Window → 2D → Tile Palette.

Acest utilitar va permite sa creati palete diferite pentru a construi usor tilemap-ul.

La aceasta paleta se adauga sprite-uri ce se vor putea folosi ulterior ca template-uri de desenare (brush).

Se pot folosi si brush-uri standard sau personalizate, prefab-uri etc.

Tile maps

Pentru a adauga un tilemap in scena, adaugati un GameObject de tipul 2D → Tilemap. Acesta va genera un Grid parinte si un tilemap.

Folosind paleta construita, se poate `picta` tilemap-ul.

Exista si posibiltatea de a folosi un prefab pentru un tile prin PrefabBrush. Acest lucru ne permite definirea de obiecte mai complexe (scriptate, de ex pickups sau inamici) si generarea lor in tile-uri.

Se pot adauga mai multe tilemap-uri in grid (spre ex unul pentru teren, unul pentru vegetatie, inamici etc)

Un tilemap poate avea si coliziuni, prin adaugarea unei componente de Tilemap Collider 2D.

Separarea in mai multe layere de tilemap ne ajuta sa adaugam coliziuni doar pentru elementele importante: de exemplu pot avea un tilemap cu pereti (care vor avea coliziune) si un tilemap cu elemente de podea sau decor in fundal, care de regula nu au coliziuni.

O componentă utilă este Colliderul Composite Collider. Adăugarea acestuia Tilemap Collider 2D va fuziona toate coliderele într-o plasă de coliziune mult mai optimizată a geometriei!

Tiles

Tile-urile pot fi scriptate, astfel ca se pot defini reguli pentru afisarea lor. Pentru a usura acest lucru, se poate folosi pachetul de add-on de ``2D extras`` de la unity: https://github.com/Unity-Technologies/2d-extras.

Astfel, aveti la dipozitie crearea simpla de tile-uri:

  • RuleTile: script de baza pentru contruirea de reguli manuale in plasarea automata a tile-urilor
  • Animate: creaza o animatie prin afișarea unei liste de sprite în ordine (sprite animation pentru tile)
  • Pipeline: iau în considerare tile-urile ortogonale învecinate și afișează un sprite daca tile-ul vecin este simlar sau nu
  • Random: aleg aleator un sprite dintr-o listă dată de sprites și o locație țintă și afișează sprite-ul
  • Terrain: iau in considerare vecinii ortogonali si diagonali si afiseaza un sprite daca tile-urile vecine este simlar sau nu

Crearea unui RuleTile va permite sa definiti usor scripturi automate de generare a terenului folosind un tile, care se afiseaza diferit in functie de amplasare.

Acest tip de tile imi permite sa definesc reguli pentru existenta sau nu a vecinilor. In functie de aceste reguli se poate folosi un sprite sau altul. X rosu inseamna ca nu trebuie sa existe, iar sageata verde indica necesitatea vecinilor.

Ouput-ul unei reguli poate fi un singur sprite, o animatie sau alegerea random a unui sprite.

Generare procedurala

Tilemaps-urile ofera, dupa cum ati vazut prin RuleTile, posibilitatea de a seta tile-urile dinamic, folosind scripturi. Asta inseamna ca se pot genera procedural tilemap-uri intregi.

Un mod usor de a genera procedural o scena, este prin folosirea de RuleTile. Astfel, se genereaza un grid care se completeaza pe alocuri cu tile-ul dinamic (RuleTile), sprite-ul afisat fiind in functie de pozitia si vecinii tile-ului curent.

Pentru a seta un tile, se poate folosi functia

using UnityEngine.Tilemaps;

[Tooltip("The Tilemap to draw onto")]
public Tilemap tilemap;
[Tooltip("The Tile to draw (use a RuleTile for best results)")]
public TileBase tile;

//SetTile(position, tile)
tilemap.SetTile(new Vector3Int(x, y, 0), tile);

Pentru a genera random o scena, se pot folosi tehnici precum Perlin Noise, Random Walk, Cellular Automata etc. Mai multe detalii si exemple de implementare gasiti aici: Part I Part II

De asemenea, in proiectul de starter, mai este definit un tip de tile, denumit PrefabTile, prin care practic se pot adauga prefab-uri ca tile-uri efectiv (se inlocuieste gameObjectul tile-ului cu cel al prefab-ului). Puteti verifica in Add-Ons > PrefabTile. Astfel, se pot folosi prefab-uri pentru generare automata de tile-uri.

Cerinte

  1. Descarcati scena de start de aici: Download ZIP
  2. Creati o paleta de sprite-uri
  3. Adaugati un tilemap
  4. Desenati tilemap-ul folosind paleta definita, adaugand coliziune pe alocuri
  5. Desenati tilemap-ul cu diverse tipuri de brush, inclusiv cu cel definit custom (GemBrush)
  6. Adaugati un nou tilemap
  7. Definiti un RuleTile si reguli pentru JungleTile (aveti deja exemplu cu GrassPlatform)
  8. Creati un script pentru a genera random o suprafata de teren/obstacole cu coliziune folosind RuleTile
  9. Creati un script pentru a genera random elemente de mediu fara coliziune (le gasiti in EnvironmentProps; puteti folosi un output de Random sau direct un RandomTile)
  10. Creati un script pentru a genera random elemente de pickup (aveti un prefab CollectableGem la dispozitie pe care il puteti folosi intr-un PrefabTile)

Resurse

pjv/laboratoare/04.txt · Last modified: 2019/10/23 16:13 by alexandru.gradinaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0