7. Building Selection UI

Introduceer abstract base classes en implementeer road placement zonder auto-tiling

Overzicht

In dit hoofdstuk leer je:

  • Abstract base classes maken (BasePlacer)

  • BuildingPlacer refactoren naar inheritance pattern

  • RoadPlacer implementeren

  • Polymorphisme toepassen in BuildingSelector

  • Switch tussen building en road placement via UI

circle-info

Waarom Abstract Base Classes?

BuildingPlacer bestaat al, RoadPlacer komt nu. Ze delen veel code:

  • Beide gebruiken GridMapRaycaster

  • Beide gebruiken GridMap

  • Beide hebben CanBuild(), Build(), Remove() methods

Een abstract base class (BasePlacer) biedt:

  • Gedeelde code op één plek

  • Consistente interface voor alle placers

  • Makkelijk nieuwe placer types toevoegen

  • Polymorphisme - BuildingSelector kan beide types aansturen met één referentie!

Dit is een professioneel design pattern dat je veel zal tegenkomen!

BasePlacer implementeren

Maak de abstract base class voor alle placer types.

Nieuwe C#-specifieke elementen:

circle-check
circle-info

Abstract vs Interface

Je vraagt je misschien af: waarom geen interface?

Abstract class voordelen:

  • Kan shared fields/properties hebben (Raycaster, GridMap)

  • Kan concrete methods hebben (shared helpers)

  • Kan constructors hebben

Interface:

  • Alleen method signatures, geen implementation

  • Geen fields, alleen properties

Een abstract class is beter voor shared state (Raycaster/GridMap)!

BuildingPlacer refactoren

Pas BuildingPlacer aan om van BasePlacer te erven.

Nieuwe C#-specifieke elementen:

circle-check
circle-check

RoadPlacer implementeren

Maak de RoadPlacer met simpele placement en removal logica.

circle-check
circle-check
circle-check

BuildingSelector uitbreiden

Voeg polymorphisme toe aan BuildingSelector om beide placer types aan te sturen.

circle-check
circle-check
circle-check
circle-check
circle-info

Demolish Input Action

Dit systeem gebruikt een nieuwe input action: demolish. Voeg deze toe aan de Input Map:

  1. Ga naar Project β†’ Project Settings β†’ Input Map

  2. Type demolish in het veld

  3. Klik Add

  4. Klik op het + icoontje bij demolish

  5. Selecteer Mouse Button

  6. Selecteer Right Button

  7. Klik OK

Rechtermuisklik tijdens het spelen om roads te verwijderen!

UI exports configureren

Koppel de RoadPlacer referentie in de BuildingSelector.

circle-check

Testen

Test de polymorphe placer switching en beide placer types.

circle-check

Veelgemaakte fouten

  • Abstract class instantiation error: Je kan geen new BasePlacer() maken - alleen child classes instantiΓ«ren!

  • Override keyword vergeten: Als je override vergeet, krijg je compiler warnings. De method signature moet EXACT overeenkomen.

  • BuildingPlacer exports verdwenen: Na refactoring naar BasePlacer inheritance moet je de Raycaster/GridMap exports opnieuw koppelen in de Inspector.

  • NullReferenceException in _UnhandledInput: _selectedPlacer is null omdat UpdatePlacer() niet is aangeroepen in _Ready(). Roep ChangeBuilding(0) aan om te initialiseren.

  • Demolish werkt niet: Controleer of je de demolish input action hebt toegevoegd in Project Settings!

Volledige scripts

chevron-rightKlik hier voor het volledige BasePlacer.cs scripthashtag
chevron-rightKlik hier voor het volledige RoadPlacer.cs scripthashtag
chevron-rightKlik hier voor het volledige BuildingPlacer.cs script (na refactoring)hashtag
chevron-rightKlik hier voor het volledige BuildingSelector.cs script (na uitbreiding)hashtag

Laatst bijgewerkt