8. Auto-Tiling System

Implementeer intelligent road auto-tiling met neighbor detection

Overzicht

In dit hoofdstuk leer je:

  • NESW neighbor detection (North, East, South, West)

  • String-based pattern matching voor tile types

  • Orientation lookup table met Dictionary

  • IsRoadTile() helper method

  • Dynamic tile updates bij placement/removal

circle-info

Waarom Auto-Tiling?

Tot nu toe plaatst het systeem altijd het straight road tile (ID 13). Dit ziet er niet realistisch uit bij corners en junctions!

Het probleem:

  • Straight road op corners → ziet er verkeerd uit

  • Straight road op T-junctions → geen verbinding

  • Straight road op intersections → chaotisch

De oplossing: Auto-Tiling

  • Detecteer hoeveel neighbors een road tile heeft (0-4)

  • Detecteer welke kant de neighbors zitten (North/East/South/West)

  • Selecteer automatisch het juiste tile type (straight/corner/T/intersection)

  • Update automatisch de orientation

MeshLibrary tile IDs:

  • 13: Straight road

  • 10: Corner road

  • 12: T-junction road

  • 11: Intersection (4-way)

Deze tiles worden automatisch geselecteerd op basis van neighbors!

Tile ID exports toevoegen

Vervang de simpele RoadTileId door aparte exports voor elk tile type.

circle-check

Directions array en lookup table

Maak een array voor neighbor directions en een Dictionary voor orientation lookups.

Nieuwe C#-specifieke elementen:

  • readonlyarrow-up-right - Field kan alleen in declaratie of constructor worden ingesteld

    • De array wordt eenmalig ingesteld en verandert nooit

    • Voorkomt bugs (kan niet per ongeluk overschreven worden)

    • Compiler optimalisatie

circle-check

IsRoadTile helper method

Maak een helper method om te checken of een tile ID een road is.

circle-check

GetTileIdFromKey implementeren

Maak een method om het juiste tile type te bepalen op basis van het neighbor pattern.

Nieuwe C#-specifieke elementen:

circle-check

UpdateRoadTile implementeren

Maak een method om een enkele road tile te updaten op basis van zijn neighbors.

circle-check

UpdateSurroundingTiles implementeren

Maak een method om alle neighbors van een cel te updaten.

circle-check

Build() en Remove() updaten

Integreer auto-tiling in de placement en removal methods.

circle-check

CanBuild() updaten

Pas de grass check aan om de nieuwe GrassTileId te gebruiken.

circle-check

Testen

Test alle tile types en orientations.

circle-check

Veelgemaakte fouten

  • Lookup table KeyNotFoundException: Dit gebeurt als een pattern niet in de Dictionary zit. Check of je alle patterns hebt toegevoegd (straight, corner, T, intersection). De TryGetValue() check voorkomt dit - als je toch errors ziet, check of je TryGetValue gebruikt.

  • Verkeerde tile IDs: De IDs zijn 10-13, niet 14-17. Check je exports in de Inspector (Straight=13, Corner=10, T-junction=12, Intersection=11).

  • Tiles updaten niet: Vergeet niet UpdateSurroundingTiles() aan te roepen in beide Build() en Remove().

  • IsRoadTile() geeft verkeerde resultaten: De range check is >= 10 && <= 14. Als je andere tile IDs gebruikt, pas de range aan.

  • Pattern string is verkeerd: Check dat je $"{n}{e}{s}{w}" gebruikt (NESW volgorde). Een verkeerde volgorde geeft verkeerde patterns.

Volledig script

chevron-rightKlik hier voor het volledige RoadPlacer.cs script met auto-tilinghashtag

Laatst bijgewerkt