4. Raycast Hit Detection
Implementeer instant-hit raycast shooting met accurate central aiming
Overzicht
In dit hoofdstuk implementeer je een shooting systeem met instant hit detection. Je maakt een target om op te schieten en gebruikt een central raycast voor accurate aiming - precies waar je crosshair naar kijkt.
Target scene maken

Maak een nieuwe scene aan
Voeg een RigidBody3D node toe
Sleep models/target-detail.glb in de scene, als child van de RidigBody
Voeg aan de RigidBody ook een CollisionShape3D toe
Selecteer de CollisionShape3D, en pas de Shape property aan naar CylinderShape3D in de inspector
Draai de CollisionShape3D 90° rond de Z-as
Gebruik de rode handles om de Collisionshape ongeveer dezelfde grootte te geven als het target
Sla de scene op als objects/target.tscn
Open scenes/main.tscn
Sleep de Target.tscn scene naar de hierarchy of viewport
Positioneer het target zodat je het kan zien vanaf de spawn positie van de speler
Test met F6 - je zou het target moeten kunnen zien
AimRaycast Toevoegen

In FPS games is het belangrijk dat je schiet waarop je mikt. De meeste games gebruiken een raycast systeem waar de crosshair in het midden van het scherm exact overeenkomt met wat je raakt.
Voeg een RayCast3D toe aan de camera die altijd recht vooruit kijkt - dit is wat de crosshair vertegenwoordigt.
Open objects/Player.tscn
Selecteer de Camera3D node
Rechts-klik > Add Child Node > RayCast3D
Hernoem naar AimRaycast
In de Inspector:
Target Position:
x: 0, y: 0, z: -100- 100 meter vooruitEnabled: AAN (altijd actief)
Collide With Areas: UIT (alleen solid bodies)
Zet de raycast een beetje voor de speler, zodat je jezelf niet raakt
Sla de scene op
Scene hierarchy:
Railgun fire method
Wanneer de speler schiet, geeft de Player de volledige raycast door aan het wapen. Het wapen kan dan zelf bepalen wat er geraakt is en waar precies de hit was. Dit geeft ons alle informatie die we nodig hebben: het geraakt object én het exacte collision point.
Pas daarom het Shoot-signaal aan van de Player, zodat het de raycast meegeeft als parameter. Daarna passen we het Railgun script aan om te checken of de raycast een Target raakt en deze te vernietigen.
Open scripts/player.cs
Voeg een
raycastparameter toe aan de ShootEventHandler:
Voeg een [Export] variabele toe om de AimRaycast te kunnen gebruiken.
Wanneer je het Shoot signaal uitstuurt, geef je de hele raycast mee:
Open scripts/railgun.cs
Pas de
OnShoot()method aan om de raycast te ontvangen:
Uitleg:
RayCast3D raycast: De volledige raycast van de Playerraycast.GetCollider(): Haal het geraakt object opis Target targetHit: Pattern matching - check type en cast in één keertargetHit.OnHit(): Roep de OnHit method aan op het Target objectNu gebruiken we ook
raycast.GetCollisionPoint()om de beam te updaten naar het exacte hit point
Beam naar hit point
Nu we de raycast hebben, kunnen we de beam visualisatie updaten zodat deze naar het exacte collision point wijst in plaats van alleen vooruit.
Open scripts/Railgun.cs
Update de
OnShoot()method om de beam naar het raycast hit point te richten:
Test met F6 - de beam wijst nu naar het exacte punt waar de raycast raakt!
AimRaycast Toewijzen
Open objects/Player.tscn
Selecteer de Player node
In de Inspector zie je nu de Aim Raycast property
Sleep de AimRaycast node naar deze property
Sla de scene op
Test met F5 - klik met de muis en kijk naar de Output tab
Target script
Nu maken we het zo dat targets vernietigd worden wanneer ze geraakt worden door de raycast.
Open objects/Target.tscn
Selecteer de RigidBody3D child node
Attach een nieuw script:
Class Name: Target
Path: res://scripts/Target.cs
Voeg een
_rootfield enOnHit()method toe:
Ga terug naar de Godot Editor
Selecteer de RigidBody3D node (waar het script op zit)
In de Inspector zie je nu de Root property
Sleep de Target root node (de parent Node3D) naar deze property
Sla de scene op
Waarom een _root field? Door de root node expliciet toe te wijzen, kan het script werken met verschillende scene structuren. Later kunnen we dit script hergebruiken voor enemies die misschien een andere node hierarchy hebben.
Target destruction
Nu hoef je alleen nog de OnHit()-methode op het Target object aan te roepen wanneer het Railgun een Target raakt.
Check of de raycast een Target raakt:
raycast.GetCollider(): Haal het geraakt object op uit de raycastis Target targetHit: Pattern matching - check type en cast in één keertargetHit.OnHit(): Roep de OnHit method aan om het target te vernietigen
Test het shooting system
Run de scene met F6
Beweeg met WASD en kijk rond met de muis
Klik met de linker muisknop om te schieten
Mik op het target - het zou instant moeten verdwijnen wanneer het midden van het scherm erop staat!
Kijk naar de Output tab om de hit detection berichten te zien
Troubleshooting:
Raycast raakt niets? Check of AimRaycast Enabled is en Target Position correct is (-100 in Z)
Targets verdwijnen niet? Check of je de AimRaycast hebt toegewezen in de Player Inspector
"Hit: ..." verschijnt niet? Check of het Shoot signaal correct is verbonden met het Railgun
Complete scripts
Laatst bijgewerkt