Bruk denne teknikken til å forbedre fiendens bevegelser og oppførsel ved å etterligne grunnleggende syn.

Linje-of-sight-deteksjon legger til et lag av kompleksitet til spillet ditt med en mekanisme som lar karakterer eller objekter oppfatte omgivelsene sine. Du kan bruke denne funksjonen for fiendens AI-adferd, spillersynlighetsmekanikk, snikende spilling og mer.

I Godot tilbyr RayCast2D-noden en enkel og effektiv måte å oppnå line-of-sight-deteksjon.

Sette opp Godot-spillet

Før du dykker inn i RayCast2D-noder, sett opp et grunnleggende 2D-spillmiljø i Godot 4. Lag en spiller tegn som kan bevege seg rundt ved hjelp av tastaturinndata og samhandle med plattformer.

Lag først en scene for spillerkarakteren. Legg til en CharacterBody2D node som roten til scenen. Inne i CharacterBody2D, Legg til en CollisionShape2D med en rektangelform og en Sprite2D for karakterens visuelle representasjon.

Koden som brukes i denne artikkelen er tilgjengelig i denne GitHub-depot og er gratis for deg å bruke under MIT-lisensen.

instagram viewer

Her er GDScript-koden for spillerbevegelsen:

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)

Lag noen plattformer som spilleren kan samhandle med. Du kan bruke StaticBody2D noder med passende kollisjonsformer for å representere plattformene. Ordne dem i scenen for å skape et plattformmiljø.

Sette opp RayCast2D

For å opprette line-of-sight-deteksjon, bruk RayCast2D node. Slik kan du legge til en RayCast2D node ved hjelp av GDScript:

var raycast: RayCast2D

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

Sørg for å legge ved dette skriptet til CharacterBody2D node. Denne kodebiten oppretter en ny RayCast2D node og fester den som barn til spillerkarakteren.

Gir visuell tilbakemelding på line-of-sight interaksjon

Nå kan du skrive ut en melding hver gang spillerens siktelinje krysser en plattform. Kast en stråle fra spillerens posisjon i bevegelsesretningen. Hvis strålen kolliderer med et objekt, betyr det at spilleren har en siktlinje til en plattform.

Legg til følgende kode i det samme skriptet:

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

raycast.target_position = Vector2(100, 0)

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

Her er utgangen:

Utvide RayCast2Ds funksjonalitet

Det er mange avanserte funksjoner du kan bruke for å forbedre spillets interaktivitet og kompleksitet betydelig.

get_collider()

Bruker get_collider() metode, kan du få tilgang til det første objektet som er krysset av strålen. Metoden returnerer null hvis ingen gjenstand er i strålens bane. Dette er spesielt nyttig for å identifisere det spesifikke objektet som spilleren din har en siktlinje til.

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() metoden kan fortelle deg ressurs-IDen (RID) til det første krysset objektet:

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() funksjonen returnerer form-ID-en til det første kryssede objektet, eller 0 hvis ingen kollisjon oppstår.

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 å forstå samspillet bedre, get_collision_normal() gir deg normalen til formen ved kollisjonspunktet. I tilfeller hvor strålen starter innenfor formen og treff_fra_innsiden er sant, vil den normale returnerte 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 skjærer et objekt, get_collision_point() returnerer det nøyaktige kollisjonspunktet i globale koordinater.

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

Ved å bruke disse avanserte egenskapene til RayCast2D node, kan du få kritisk innsikt i samspillet mellom strålen og kolliderende objekter.

Disse metodene gir deg mulighet til å samle viktig informasjon som kan påvirke spillmekanikk, objektinteraksjoner og tilbakemeldinger fra spillerne betydelig.

Inkludert tilleggsfunksjoner

I tillegg til kjernefunksjonaliteten for deteksjon av siktlinje, kan du forbedre spillets dynamikk ytterligere ved å implementere noen avanserte funksjoner.

Hendelsesutløsere

I stedet for bare å skrive ut en melding, kan du utløse spesifikke hendelser i spillet. For eksempel kan det å avsløre skjulte stier, aktivere mekanismer eller varsle fiender om spillerens tilstedeværelse gi dybde til spillet ditt.

Dynamisk håndtering av hindringer

Vurder scenarier der hindringer kan hindre siktlinjen. Implementering av dynamisk obstruksjonsdeteksjon sikrer at siktlinjen oppdateres i sanntid når objekter beveger seg inn og ut av spillerens syn.

Egendefinerte visuelle indikatorer

I stedet for å stole utelukkende på tekst, kan du lage tilpassede visuelle indikatorer for å fremheve tilstedeværelsen av siktlinjeinteraksjoner. Dette kan innebære å endre fargen på spilleren eller objektspriten, vise et ikon eller animere relevante elementer.

Fog of War Mechanics

For strategi- eller utforskningsfokuserte spill kan du introdusere krigståkemekanikk. Dette begrenser spillerens visjon til de etablerer en siktlinje, avslører spillverdenen gradvis og oppmuntrer til strategiske beslutninger.

Beste praksis for deteksjon av siktlinje

Optimalisering av line-of-sight-deteksjon er avgjørende for å opprettholde en jevn spillopplevelse. Her er noen beste fremgangsmåter du bør huske på.

Raycast-frekvens

Unngå å utføre raycasts hver frame hvis ikke nødvendig. Vurder å se etter sikte bare når spillerens posisjon eller miljøet endres betydelig. Dette bidrar til å redusere unødvendige beregninger.

Ray Lengde

Balanser lengden på raycasten din. Ekstremt lange stråler kan påvirke ytelsen, så velg en lengde som dekker det nødvendige området mens du holder beregningsbelastningen i sjakk.

Kollisjonslag

Bruk kollisjonslag og masker for å finjustere hvilke objekter siktlinjedeteksjonen vurderer. Dette forhindrer unødvendige stråler til irrelevante objekter.

Caching resultater

Hvis du utfører samme synslinjedeteksjon for flere objekter eller rammer, bør du vurdere å bufre resultatene for å unngå overflødige beregninger.

Integrasjon på plattformnivå

Juster siktlinjedeteksjonsmekanikken din med nivådesignet til plattformspillet ditt. Vurder vertikaliteten til omgivelsene, ulike plattformhøyder og potensielle hindringer som kan hindre siktlinjen.

Sørg for at deteksjonssystemet ditt tilpasser disse nyansene for å skape en sømløs og intuitiv spilleropplevelse.

Gjør Godot-spill mer engasjerende med synslinjedeteksjon

Linje-of-sight-deteksjon gir dybde og realisme til spillverdenen din. Spillere kan legge strategier, skjule eller nærme seg utfordringer forskjellig basert på siktelinjen deres. Denne mekanikeren kan gjøre en enkel plattformspiller til en mer oppslukende opplevelse, noe som gjør spillingen mer engasjerende og minneverdig.