Brug denne teknik til at forbedre fjendens bevægelse og adfærd ved at efterligne grundlæggende syn.

Linje-of-sight detektion tilføjer et lag af kompleksitet til dit spil med en mekanisme, der lader karakterer eller objekter opfatte deres omgivelser. Du kan bruge denne funktion til fjendens AI-adfærd, spillerens synlighedsmekanik, stealth-gameplay og mere.

I Godot tilbyder RayCast2D noden en enkel og effektiv måde at opnå line-of-sight detektion på.

Opsætning af Godot-spillet

Inden du dykker ned i RayCast2D-noder, skal du oprette et grundlæggende 2D-spilmiljø i Godot 4. Opret en spiller tegn, der kan flytte rundt ved hjælp af tastaturinput og interagere med platforme.

Først skal du oprette en scene til spillerkarakteren. Tilføj en CharacterBody2D node som scenens rod. Inde i CharacterBody2D, Tilføj en CollisionShape2D med en rektangelform og en Sprite2D for karakterens visuelle repræsentation.

Koden brugt i denne artikel er tilgængelig i denne GitHub-depot og er gratis for dig at bruge under MIT-licensen.

instagram viewer

Her er GDScript-koden til spillerbevægelsen:

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)

Opret nu nogle platforme, som spilleren kan interagere med. Du kan bruge StaticBody2D noder med passende kollisionsformer til at repræsentere platformene. Arranger dem i scenen for at skabe et platformsmiljø.

Opsætning af RayCast2D

For at oprette line-of-sight detektion skal du bruge RayCast2D node. Sådan kan du tilføje en RayCast2D node ved hjælp af GDScript:

var raycast: RayCast2D

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

Sørg for at vedhæfte dette script til CharacterBody2D node. Dette kodestykke opretter en ny RayCast2D node og knytter den som barn til spillerkarakteren.

Giver visuel feedback på line-of-sight interaktion

Nu kan du udskrive en besked, når spillerens sigtelinje krydser en platform. Kast en stråle fra spillerens position i bevægelsesretningen. Hvis strålen kolliderer med en genstand, betyder det, at spilleren har en sigtelinje til en platform.

Tilføj følgende kode til det samme script:

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

raycast.target_position = Vector2(100, 0)

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

Her er outputtet:

Udvidelse af RayCast2Ds funktionalitet

Der er mange avancerede funktioner, du kan bruge til at forbedre dit spils interaktivitet og kompleksitet markant.

get_collider()

Bruger get_collider() metode, kan du få adgang til det første objekt gennemskåret af strålen. Metoden returnerer null, hvis intet objekt er i strålens vej. Dette er især nyttigt til at identificere det specifikke objekt, som din spiller har en synslinje til.

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

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

get_collider_rid()

Det get_collider_rid() metode kan fortælle dig ressource-id'et (RID) for det første gennemskårne objekt:

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()

Det get_collider_shape() funktion returnerer form-id'et for det første gennemskårne objekt, eller 0, hvis der ikke forekommer nogen kollision.

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_collision_normal()

For bedre at forstå samspillet, get_collision_normal() forsyner dig med normalen af ​​formen ved kollisionspunktet. I tilfælde hvor strålen starter inden for formen og hit_indefra er sandt, vil den normale returnerede være Vektor2(0, 0).

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

get_collision_point()

Når strålen skærer et objekt, get_collision_point() returnerer det nøjagtige kollisionspunkt i globale koordinater.

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

Ved at bruge disse avancerede funktioner RayCast2D node, kan du få kritisk indsigt i samspillet mellem strålen og kolliderende objekter.

Disse metoder giver dig mulighed for at indsamle væsentlige oplysninger, der kan påvirke gameplaymekanikken, objektinteraktioner og spillerfeedback markant.

Inklusiv yderligere funktioner

Ud over kerne-line-of-sight detektionsfunktionalitet kan du yderligere forbedre dit spils dynamik ved at implementere nogle avancerede funktioner.

Hændelsesudløsere

I stedet for blot at udskrive en besked, kan du udløse bestemte begivenheder i spillet. For eksempel kan afsløring af skjulte stier, aktiveringsmekanismer eller advare fjender om spillerens tilstedeværelse tilføje dybde til dit gameplay.

Dynamisk forhindringshåndtering

Overvej scenarier, hvor forhindringer kan hindre sigtelinjen. Implementering af dynamisk forhindringsdetektion sikrer, at sigtelinjen opdateres i realtid, når objekter bevæger sig ind og ud af spillerens syn.

Brugerdefinerede visuelle indikatorer

I stedet for udelukkende at stole på tekst, kan du oprette brugerdefinerede visuelle indikatorer for at fremhæve tilstedeværelsen af ​​line-of-sight interaktioner. Dette kunne involvere at ændre farven på afspilleren eller objektspriten, vise et ikon eller animere relevante elementer.

Fog of War Mechanics

Til strategi- eller udforskningsfokuserede spil kan du introducere krigstågemekanik. Dette begrænser spillerens vision, indtil de etablerer en sigtelinje, afslører spilverdenen gradvist og tilskynder til strategisk beslutningstagning.

Bedste praksis for line-of-sight detektion

Optimering af line-of-sight-detektion er afgørende for at opretholde en jævn gameplay-oplevelse. Her er nogle bedste fremgangsmåder at huske på.

Raycast frekvens

Undgå at udføre raycasts hver frame, hvis det ikke er nødvendigt. Overvej kun at tjekke for sigtelinjen, når spillerens position eller omgivelserne ændrer sig væsentligt. Dette hjælper med at reducere unødvendige beregninger.

Ray Længde

Balancer længden af ​​din raycast. Ekstremt lange stråler kan påvirke ydeevnen, så vælg en længde, der dækker det nødvendige område, mens du holder den beregningsmæssige belastning i skak.

Kollisionslag

Brug kollisionslag og masker til at finjustere, hvilke objekter synslinjedetektionen tager højde for. Dette forhindrer unødvendige stråler til irrelevante objekter.

Caching resultater

Hvis du udfører den samme synslinjedetektering for flere objekter eller rammer, kan du overveje at cache resultaterne for at undgå overflødige beregninger.

Integration på platformsniveau

Tilpas din synslinjedetekteringsmekanik med niveaudesignet af dit platformspil. Overvej miljøets vertikalitet, forskellige platformshøjder og potentielle forhindringer, der kan hindre sigtelinjen.

Sørg for, at dit registreringssystem rummer disse nuancer for at skabe en problemfri og intuitiv spilleroplevelse.

Gør Godot-spil mere engagerende med line-of-sight detektion

Linje-of-sight detektion tilføjer dybde og realisme til din spilverden. Spillere kan strategisere, skjule eller nærme sig udfordringer forskelligt baseret på deres synsfelt. Denne mekaniker kan forvandle et simpelt platformspil til en mere fordybende oplevelse, hvilket gør gameplayet mere engagerende og mindeværdigt.