6. Collectibles
Implementeer munten met Area3D en track score met signals en groups
Overzicht
In dit hoofdstuk voeg je collectibles toe aan je platformer - munten die de player kan verzamelen. Je implementeert:
Coin scene met Area3D voor collision detection
Score tracking met signals en groups
ScoreManager als autoload singleton
Coin scene maken
Begin met een simpele coin-scene die je later kunt oprapen.
Ga naar Scene > New Scene
Selecteer Other Node en zoek naar Area3D
Klik Create
Hernoem de root node naar Coin
Sla de scene op als res://objects/Coin.tscn
Coin model toevoegen
Voeg nu het coin-model toe.
Open het FileSystem panel
Navigeer naar models/coin.glb en Sleep coin.glb naar de Coin root node in de Scene hierarchy
Het model wordt nu als child toegevoegd
Scene hierarchy:
CollisionShape3D Toevoegen

Elke physics body heeft een collision shape nodig.
Selecteer de Coin root node
Rechts-klik > Add Child Node > CollisionShape3D
In de Inspector van CollisionShape3D:
Shape > New SphereShape3D
Pas de SphereShape3D aan zodat deze het coin model bedekt:
Sla de scene op
Scene hierarchy (updated):
Plaats de coin in de level
Voeg de coin toe aan de level om te testen.
Open scenes/main.tscn
Ga naar het File System venster, en sleep objects/coin.tscn in de scene
Positioneer de coin ergens in de level waar de player er aan kan
Coin script toevoegen
Schrijf nu een script dat detecteert wanneer de player de coin raakt.
Open objects/coin.tscn
Selecteer de Coin root node
Klik op Attach Script
Language: C#
Template: Empty
Class Name: Coin
Path: res://scripts/Coin.cs
Klik Create
Godot maakt gebruik van een template script met een lege
_Processen_Readymethod. Deze methods hebben we voorlopig niet nodig, dus mag je ze verwijderen.Voeg een lege
OnBodyEntered()method toe:
BodyEntered Signal Verbinden
Verbind het BodyEntered-signaal van de Area3D aan je OnBodyEntered()-methode via de UI.
In objects/Coin.tscn, selecteer de root (Area3D) node
Ga naar het Node tabblad in de Inspector (naast de Inspector tab)
Dubbelklik op het body_entered(body: Node3D) signal
In het "Connect a Signal" venster:
Receiver Method:
OnBodyEntered(type dit in)Zorg dat Coin geselecteerd is (de node met het script) als receiver node
Klik Connect En pas de signature van
OnBodyEntered()aan naar:
Test de signal connection
Test eerst of de signal correct verbonden is.
Test met F5:
Spring of loop doorheen de coin
Check de Output console (onderaan in Godot)
Zie je "Coin touched by: Player!" in de console?
Coin verzamelen
Wanneer de Coin wordt geraakt, moeten er een aantal zaken gebeuren.
de coin moet verdwijnen
een signal moet verstuurd worden dat er een punt verzameld is
dit mag enkel gebeuren als het de speler is die de coin aanraakt
Check eerst of de parameter
bodyvan het typePlayeris, zodat de Coin alleen reageert op de player (en niet op enemies of andere objects)
QueueFree()markeert de node voor verwijdering aan het eind van het frame
ScoreManager
In plaats van een ScoreManager node in elke scene te plaatsen, maak je het een autoload. Dit betekent dat ScoreManager automatisch beschikbaar is in het hele spel, en de score blijft behouden zelfs als je van scene wisselt.
Maak een nieuw C# script in de scripts folder:
Rechts-klik op de scripts folder in FileSystem
Create New > Script
Path: scripts/ScoreManager.cs
Template: Empty
Klik Create
Open scripts/ScoreManager.cs en voeg de basis code toe:
Registreer ScoreManager als autoload:
Ga naar Project > Project Settings
Klik op het Globals tab (of Autoload)
Bij Path: Klik op het folder icon en selecteer scripts/ScoreManager.cs
Bij Node Name: Type ScoreManager (dit is de naam waarmee je het overal kan aanroepen)
Klik Add
Klik Close
Score tracking - signals
Wanneer een Coin wordt verzameld, wil je dat die coin een signaal uitstuurt waar de ScoreManager naar kan luisteren.
Open het Coin script
Voeg een Signal toe aan het Coin script.
Roep
EmitSignal()aan wanneer de coin verzameld wordt:
Coin group

Nu moet je alle coins vinden in de level om te luisteren naar hun Signals. Groups zijn een Godot feature om nodes te organiseren. Door alle Coins in één group te plaatsen, kan de ScoreManager gemakkelijk alle Coins vinden.
Open objects/Coin.tscn
Selecteer de Coin root node
In het Node venster rechtsboven (naast Inspector), klik de Groups tab
Klik op het + icoontje (Add a new group)
Typ coins in het veld
Vink Global aan, zodat we de group overal kunnen terugvinden
Klik Add
Sla op - nu zit elke Coin instance automatisch in de "coins" group
ScoreManager Logic
De scoreManager moet reageren wanneer een Coin een signaal uitstuurt dat die is verzameld. Om dat te kunnen doen, moet de scoreManager aan begin van het spel alle coins in de level vinden, en vervolgens een functie koppelen aan het collected Signal van elke Coin.
Voeg de _Ready method terug toe aan de ScoreManager klasse.
Voeg een
OnCoinCollectedmethod toe aan de ScoreManager, waarin de score wordt verhoogt met 1
Gebruik
GetTree().GetNodesInGroup()om alle nodes in een group op te halen.
Loop door alle coins en subscribe op hun
Collectedsignal. In plaats van dit te doen via de Godot Editor, doen we het ditmaal met code. Met behulp vansignalname += methodnameverbind je een method (methodname) aan een signal (signalname). Let daarbij op dat je géén haakjes gebruikt bij de methodname!
Meerdere coins toevoegen
Open scenes/main.tscn
Duplicate de bestaande Coin node (Ctrl+D of rechts-klik > Duplicate)
Positioneer coins verspreid over de level
Maak 5-8 coins zodat je score tracking goed kan testen
Sla de scene op
Test score tracking
Run het spel (F5)
Check de Output panel onderaan - je ziet "Subscribed to X coins"
Verzamel coins
Je ziet nu:
Complete scripts
Laatst bijgewerkt