5. Enemies
CreΓ«er enemies die naar de speler kijken en schieten met herbruikbare components
Overzicht
In dit hoofdstuk maak je een enemy die automatisch naar de speler kijkt en schiet. Je leert hoe je code hergebruikt door bestaande scripts (Target.cs en Railgun.cs) toe te passen op een nieuwe context. De enemy gebruikt compositie - je bouwt complex gedrag door simpele, herbruikbare componenten te combineren.
Enemy model collider

Maak een enemy om op te schieten. Gebruik het enemy-flying.glb model uit de assets, precies zoals je eerder de Target hebt gemaakt in Chapter 4. Voor je daarmee van start gaat, moet je er eerst voor zorgen dat je de enemy kunt raken. Gebruik een RigidBody3D zodat de enemy realistisch reageert op projectiles - het kan kantelen, vallen of omvallen wanneer het geraakt wordt.
Dubbelklik op models/enemy-flying.glb in het FileSystem venster om de import settings te openen
In het Import venster in het Scene Hierarchy venster, selecteer de torso node
Aan de rechterkant vind je de import-opties
Vink Physics aan in het generate gedeelte
In de Physics sectie daaronder, zet Body Type op Dynamic
Klik onderaan op Reimport
Enemy scene setup

Nu ons enemy model een collider heeft, kun je een eigen Enemy scene maken. Het enemy-flying model heeft een geneste structuur met een RigidBody3D genaamd "torso" die we gaan gebruiken voor destruction.
Ga in de menu naar Scene > Open Scene...
Navigeer naar models/enemy-flying.glb
Klik op Open
Godot toont een waarschuwing dat je enemy-flying niet rechtstreeks kunt aanpassen, maar je kan wel een nieuwe scene maken gebaseerd op dit Asset. Klik daarom op New Inherited
Selecteer de enemy-flying root node in de hierarchy en hernoem deze naar Enemy
Sla de scene op als res://objects/Enemy.tscn
Je scene hierarchy zou er nu zo uit moeten zien:
Target script herbruiken
De enemy moet vernietigd kunnen worden wanneer hij geraakt wordt door een projectile. Dit heb je al geΓ―mplementeerd in Chapter 4! Het Target.cs script werkt perfect voor de enemy - het detecteert hits en vernietigt de parent node.
Het character-enemy model heeft een torso RigidBody3D - dit is de physics body die door projectiles geraakt kan worden. Voeg Target.cs toe aan deze torso-node.
Open objects/Enemy.tscn (als het nog niet open staat)
Selecteer de torso child node (dit is de RigidBody3D onder root)
Klik Attach Script (het π icoontje met een +, bovenaan het Scene Hierarchy venster)
In het "Attach Node Script" venster, klik op het folder icoon naast Path
Navigeer naar scripts/Target.cs
Selecteer Target.cs en klik Open
Klik Load
Sleep de Enemy node naar de Root property in de inspector
Sla de Enemy scene op
Railgun script herbruiken
Hergebruik nu het weapon-systeem! In plaats van nieuwe shooting code te schrijven, gebruik je gewoon de bestaande blaster nodes in het model. Het enemy-flying model heeft al twee blaster visual nodes (blaster-left en blaster-right). Voeg het Railgun.cs-script toe aan deze nodes - zo krijgt de enemy exact dezelfde shooting mechanics als de speler!
Selecteer de blaster-left node (dit is een MeshInstance3D onder root)
Klik Attach Script (het icoontje met een +)
In het "Attach Node Script" venster, klik op het folder icoon naast Path
Navigeer naar scripts/Railgun.cs
Selecteer Railgun.cs en klik Open
Klik Load
Doe nu hetzelfde voor de blaster-right
Sla de Enemy scene op
Weapon components toevoegen
Elk weapon heeft dezelfde components nodig als de player's railgun: een Timer, een Muzzle marker, en een weapon mount point.
Selecteer de blaster-left node
Rechts-klik > Add Child Node > Timer
Hernoem naar FireRateTimer
Configureer in de Inspector:
Wait Time: 0.5
One Shot: Aan
Autostart: Uit
Selecteer de blaster-left node opnieuw
Rechts-klik > Add Child Node > Marker3D
Hernoem naar Muzzle
Positioneer de Muzzle aan het uiteinde van de blaster (gebruik Move tool)
Herhaal stappen 1-8 voor blaster-right
Sla de scene op
Je scene hierarchy is nu:
Enemy aimraycast toevoegen
Net zoals de speler, heeft de enemy een RayCast3D nodig om te bepalen waar zijn weapons naar moeten schieten. Deze raycast wijst altijd in de richting waarin de enemy kijkt.
In objects/Enemy.tscn, selecteer de Enemy root 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)
Sla de scene op
Je scene hierarchy is nu:
Configure enemy railguns
De Enemy's Railguns hebben dezelfde configuration nodig als de Player's Railgun: een weapon mount point, muzzle marker, en fire rate timer.
Voor de weapon mount, gebruiken we gewoon de blaster nodes zelf.
In objects/Enemy.tscn, selecteer de blaster-left node
In de Inspector, zie je de exported properties:
Fire Rate Timer: Sleep de FireRateTimer (child van blaster-left) hiernaartoe
Weapon Mount: Klik Assign > selecteer blaster-left (zichzelf)
Muzzle: Sleep de Muzzle (child van blaster-left) hiernaartoe
Doe nu hetzelfde voor blaster-right
Sla de scene op
Enemy ai script
Nu maken we het Enemy script dat de AI afhandelt. De enemy moet:
Naar de speler kijken (LookAt)
Het Shoot signal uitzenden met de raycast (net zoals Player)
Selecteer de Enemy root node
Klik Attach Script
Language: C#
Class Name: Enemy
Path: res://scripts/Enemy.cs
Klik Create
Voeg een Shoot Signal toe aan het Enemy script dat de raycast parameter accepteert:
Voeg referenties toe voor de speler en de aim raycast:
Wanneer de enemy spawnt, zoek je naar een speler in de scene:
Laat de Enemy nu elke frame (dus in
_Process(delta)) draaien in de richting van de speler:
Wanneer de enemy kijkt naar de speler, stuurt het het Shoot-signaal uit met de raycast:
Selecteer de Enemy root node in de Editor
In de Inspector, sleep de AimRaycast node naar de Aim Raycast property
Sla de scene op
Connect enemy shoot signal

Net zoals je in Chapter 3 de Player's Shoot signal hebt verbonden met de Railgun, moet je nu het Shoot-signaal van de Enemy verbinden met beide railgun weapons.
Selecteer de Enemy root node in de hierarchy
Aan de rechterkant van de Editor, naast de Inspector tab, vind je het Node venster (klik erop als het niet zichtbaar is)
Met de Enemy geselecteerd, zie je in het Node venster alle signals die de Enemy kan uitzenden
Dubbelklik op het Shoot signal
In het venster "Connect a Signal to a Method" selecteer je de blaster-left child node (dit is de ontvanger)
Bij Receiver Method klik op Pick
Selecteer de OnShoot method uit de lijst
Klik op Connect
Herhaal deze stappen voor de blaster-right
In de Scene Hierarchy zie je nu een signaal-icoontje naast de Enemy node
Sla de scene op
Add enemy to main scene
Voeg nu de Enemy toe aan het level en test!
Open scenes/main.tscn
Sleep de Enemy.tscn scene naar de hierarchy of viewport
Positioneer de enemy zodat je hem kan zien vanaf de spawn positie van de speler
Bijvoorbeeld: Position (-5, 1, -10)
Run de scene met F6
De enemy zou automatisch naar je moeten kijken
De enemy zou automatisch moeten schieten
Schiet terug met linker muisknop
Wanneer je de enemy raakt, zou hij moeten verdwijnen!
Sla main.tscn op
Complete scripts
Laatst bijgewerkt