Gebruik deze techniek om de bewegingen en het gedrag van de vijand te verbeteren door het basisvisie te emuleren.

Gezichtslijndetectie voegt een laagje complexiteit toe aan je spel met een mechanisme waarmee personages of objecten hun omgeving kunnen waarnemen. Je kunt deze functie gebruiken voor vijandelijk AI-gedrag, zichtbaarheid van spelers, stealth-gameplay en meer.

In Godot biedt het RayCast2D-knooppunt een eenvoudige en efficiënte manier om zichtlijndetectie te realiseren.

Het Godot-spel opzetten

Voordat u in RayCast2D-nodes duikt, moet u een eenvoudige 2D-spelomgeving opzetten in Godot 4. Maak een speler karakter dat kan bewegen met behulp van toetsenbordinvoer en interactie met platforms.

Maak eerst een scène voor het personage van de speler. Voeg een... toe KarakterLichaam2D knooppunt als de wortel van de scène. Binnen in de KarakterLichaam2D, Voeg een... toe Botsingsvorm2D met een rechthoekige vorm en een Sprite2D voor de visuele representatie van het personage.

De code die in dit artikel wordt gebruikt, is hierin beschikbaar

GitHub-opslagplaats en kunt u gratis gebruiken onder de MIT-licentie.

Hier is de GDScript-code voor de spelersbeweging:

extends CharacterBody2D

var speed = 300

func _physics_process(delta):
var input_dir = Vector2.ZERO

if Input.is_action_pressed("ui_left"):
input_dir.x -= 1

if Input.is_action_pressed("ui_right"):
input_dir.x += 1

if Input.is_action_pressed("ui_up"):
input_dir.y -= 1

if Input.is_action_pressed("ui_down"):
input_dir.y += 1

velocity = input_dir.normalized() * speed
move_and_collide(velocity * delta)

Creëer nu enkele platforms waarmee de speler kan communiceren. Je kunt gebruiken StatischBody2D knooppunten met geschikte botsingsvormen om de platforms weer te geven. Plaats ze in de scène om een ​​platformomgeving te creëren.

RayCast2D instellen

Om zichtlijndetectie te creëren, gebruikt u de RayCast2D knooppunt. Zo kunt u een RayCast2D knooppunt met GDScript:

var raycast: RayCast2D

func _ready():
raycast = RayCast2D.new()
add_child(raycast)

Zorg ervoor dat u dit script aan het KarakterLichaam2D knooppunt. Met dit codefragment wordt een nieuw RayCast2D knooppunt en koppelt het als een kind aan het personage van de speler.

Visuele feedback geven over line-of-sight-interactie

Nu kun je een bericht afdrukken wanneer de gezichtslijn van de speler een platform kruist. Werp een straal vanuit de positie van de speler in de bewegingsrichting. Als de straal tegen een object botst, betekent dit dat de speler zicht heeft op een platform.

Voeg de volgende code toe aan hetzelfde script:

func _physics_process(delta):
#... (previous movement code)

raycast.target_position = Vector2(100, 0)

if raycast.is_colliding():
print("Collided with platform!")

Hier is de uitvoer:

Uitbreiding van de functionaliteit van RayCast2D

Er zijn veel geavanceerde functies die u kunt gebruiken om de interactiviteit en complexiteit van uw spel aanzienlijk te verbeteren.

get_collider()

De... gebruiken get_collider() Met deze methode heeft u toegang tot het eerste object dat door de straal wordt doorsneden. De methode retourneert null als er zich geen object in het pad van de straal bevindt. Dit is vooral handig voor het identificeren van het specifieke object waar uw speler zicht op heeft.

if raycast.is_colliding():
var collided_object = raycast.get_collider()

if collided_object:
print("You can see:", collided_object.name)

get_collider_rid()

De get_collider_rid() methode kan u de Resource ID (RID) van het eerste doorsneden object vertellen:

if raycast.is_colliding():
var collider_rid = raycast.get_collider_rid()

if !collider_rid.is_valid():
print("No valid object RID")
else:
print("Object RID:", collider_rid)

get_collider_shape()

De get_collider_shape() functie retourneert de vorm-ID van het eerste doorsneden object, of 0 als er geen botsing plaatsvindt.

if raycast.is_colliding():
var collider_shape = raycast.get_collider_shape()

if collider_shape == 0:
print("No valid shape ID")
else:
print("Shape ID:", collider_shape)

get_botsing_normaal()

Om de interactie beter te begrijpen, get_botsing_normaal() geeft u de normaal van de vorm op het botspunt. In gevallen waarin de straal begint binnen de vorm en hit_from_inside waar is, zal het normale resultaat zijn Vector2(0, 0).

if raycast.is_colliding():
var collision_normal = raycast.get_collision_normal()
print("Collision Normal:", collision_normal)

get_botsingspunt()

Wanneer de straal een voorwerp snijdt, get_botsingspunt() geeft het exacte botsingspunt in globale coördinaten terug.

if raycast.is_colliding():
var collision_point = raycast.get_collision_point()
print("Collision Point:", collision_point)

Door gebruik te maken van deze geavanceerde mogelijkheden van de RayCast2D knooppunt, kunt u kritisch inzicht krijgen in de interacties tussen de straal en botsende objecten.

Met deze methoden kun je essentiële informatie verzamelen die een aanzienlijke invloed kan hebben op de gameplay-mechanica, objectinteracties en spelersfeedback.

Inclusief extra functies

Naast de basisfunctionaliteit voor gezichtslijndetectie, kun je de dynamiek van je game verder verbeteren door een aantal geavanceerde functies te implementeren.

Gebeurtenistriggers

In plaats van alleen maar een bericht af te drukken, kun je specifieke in-game-evenementen activeren. Het onthullen van verborgen paden, het activeren van mechanismen of het waarschuwen van vijanden voor de aanwezigheid van de speler kan bijvoorbeeld diepte aan je gameplay toevoegen.

Dynamische afhandeling van obstakels

Overweeg scenario's waarin obstakels de zichtlijn kunnen belemmeren. Het implementeren van dynamische obstakeldetectie zorgt ervoor dat de gezichtslijn in realtime wordt bijgewerkt wanneer objecten in en uit het zicht van de speler bewegen.

Aangepaste visuele indicatoren

In plaats van uitsluitend op tekst te vertrouwen, kunt u aangepaste visuele indicatoren maken om de aanwezigheid van zichtlijninteracties te benadrukken. Dit kan het veranderen van de kleur van de speler of object-sprite inhouden, het weergeven van een pictogram, of het animeren van relevante elementen.

Mist van oorlogsmechanica

Voor strategie- of verkenningsgerichte games kun je oorlogsmistmechanismen introduceren. Dit beperkt het zicht van de speler totdat hij een gezichtslijn heeft, waardoor de spelwereld geleidelijk wordt onthuld en strategische besluitvorming wordt aangemoedigd.

Beste praktijken voor gezichtslijndetectie

Het optimaliseren van gezichtslijndetectie is cruciaal voor het behouden van een soepele gameplay-ervaring. Hier volgen enkele best practices waarmee u rekening moet houden.

Raycast-frequentie

Vermijd het uitvoeren van raycasts bij elk frame als dit niet nodig is. Overweeg alleen om de zichtlijn te controleren als de positie van de speler of de omgeving aanzienlijk verandert. Dit helpt onnodige berekeningen te verminderen.

Straal lengte

Breng de lengte van uw raycast in evenwicht. Extreem lange stralen kunnen de prestaties beïnvloeden, dus kies een lengte die het benodigde gebied bestrijkt en tegelijkertijd de rekenbelasting onder controle houdt.

Botsingslagen

Gebruik botsingslagen en maskers om nauwkeurig af te stemmen welke objecten door de gezichtslijndetectie in aanmerking worden genomen. Dit voorkomt onnodige raycasts naar irrelevante objecten.

Resultaten in cache opslaan

Als u dezelfde zichtlijndetectie uitvoert voor meerdere objecten of frames, kunt u overwegen de resultaten in het cachegeheugen op te slaan om overbodige berekeningen te voorkomen.

Integratie op platformerniveau

Stem uw zichtlijndetectiemechanismen af ​​op het niveauontwerp van jouw platformgame. Houd rekening met de verticaliteit van de omgeving, verschillende platformhoogtes en potentiële obstakels die de zichtlijn kunnen belemmeren.

Zorg ervoor dat uw detectiesysteem rekening houdt met deze nuances om een ​​naadloze en intuïtieve spelerservaring te creëren.

Godot-spellen aantrekkelijker maken met gezichtslijndetectie

Gezichtslijndetectie voegt diepte en realisme toe aan uw gamewereld. Spelers kunnen uitdagingen op verschillende manieren bedenken, verbergen of benaderen op basis van hun gezichtsveld. Deze monteur kan van een eenvoudige platformgame een meeslepende ervaring maken, waardoor de gameplay boeiender en gedenkwaardiger wordt.