Använd denna teknik för att förbättra fiendens rörelser och beteende genom att efterlikna grundläggande syn.

Linjeavkänning lägger till ett lager av komplexitet till ditt spel med en mekanism som låter karaktärer eller föremål uppfatta sin omgivning. Du kan använda den här funktionen för fiendens AI-beteende, spelarens synlighetsmekanik, smygspel och mer.

I Godot erbjuder RayCast2D-noden ett enkelt och effektivt sätt att uppnå siktlinjedetektering.

Konfigurera Godot-spelet

Innan du dyker in i RayCast2D-noder, ställ in en grundläggande 2D-spelmiljö i Godot 4. Skapa en spelare tecken som kan flytta runt med tangentbordsingångar och interagera med plattformar.

Skapa först en scen för spelarkaraktären. Lägg till en CharacterBody2D nod som roten till scenen. Inuti CharacterBody2D, Lägg till en CollisionShape2D med en rektangelform och en Sprite2D för karaktärens visuella representation.

Koden som används i den här artikeln är tillgänglig i denna GitHub-förråd och är gratis för dig att använda under MIT-licensen.

instagram viewer

Här är GDScript-koden för spelarrörelsen:

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)

Skapa nu några plattformar för spelaren att interagera med. Du kan använda StaticBody2D noder med lämpliga kollisionsformer för att representera plattformarna. Ordna dem i scenen för att skapa en plattformsmiljö.

Installation av RayCast2D

För att skapa siktlinjedetektering, använd RayCast2D nod. Så här kan du lägga till en RayCast2D nod med GDScript:

var raycast: RayCast2D

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

Se till att bifoga det här skriptet till CharacterBody2D nod. Detta kodavsnitt skapar en ny RayCast2D nod och fäster den som barn till spelarkaraktären.

Ge visuell feedback på linje-of-sight interaktion

Nu kan du skriva ut ett meddelande när spelarens siktlinje korsar en plattform. Kasta en stråle från spelarens position i rörelseriktningen. Om strålen kolliderar med ett föremål betyder det att spelaren har en siktlinje till en plattform.

Lägg till följande kod till samma skript:

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

raycast.target_position = Vector2(100, 0)

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

Här är utgången:

Utöka RayCast2Ds funktionalitet

Det finns många avancerade funktioner som du kan använda för att avsevärt förbättra ditt spels interaktivitet och komplexitet.

get_collider()

Använda get_collider() metod kan du komma åt det första objektet som skärs av strålen. Metoden returnerar null om inget objekt är i strålens väg. Detta är särskilt användbart för att identifiera det specifika objekt som din spelare har en siktlinje till.

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() metod kan berätta för dig resurs-ID (RID) för det första korsade 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() funktionen returnerar form-ID: t för det första skärade objektet, eller 0 om ingen kollision inträffar.

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

För att förstå interaktionen bättre, get_collision_normal() förser dig med normalen av formen vid kollisionspunkten. I de fall då strålen börjar inom formen och träffa_inifrån är sant, kommer det normala returneras att vara 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är ett föremål, get_collision_point() returnerar den exakta kollisionspunkten i globala koordinater.

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

Genom att använda dessa avancerade funktioner RayCast2D nod, kan du få kritiska insikter i interaktionerna mellan strålen och kolliderande objekt.

Dessa metoder ger dig möjlighet att samla in viktig information som avsevärt kan påverka spelmekaniken, objektinteraktioner och spelarfeedback.

Inklusive ytterligare funktioner

Förutom den centrala linje-of-sight-detektionsfunktionaliteten kan du ytterligare förbättra ditt spels dynamik genom att implementera några avancerade funktioner.

Händelseutlösare

Istället för att bara skriva ut ett meddelande kan du utlösa specifika händelser i spelet. Att till exempel avslöja dolda vägar, aktivera mekanismer eller varna fiender om spelarens närvaro kan ge djup till ditt spelande.

Dynamisk hinderhantering

Tänk på scenarier där hinder kan hindra sikten. Genom att implementera dynamisk hinderdetektion säkerställs att siktlinjen uppdateras i realtid när objekt rör sig in och ut ur spelarens synfält.

Anpassade visuella indikatorer

Istället för att bara förlita dig på text kan du skapa anpassade visuella indikatorer för att markera närvaron av siktlinjeinteraktioner. Detta kan handla om att ändra färgen på spelaren eller objektspriten, visa en ikon eller animera relevanta element.

Fog of War Mechanics

För strategi- eller utforskningsfokuserade spel kan du introducera krigsdimma. Detta begränsar spelarens vision tills de etablerar en siktlinje, avslöjar spelvärlden gradvis och uppmuntrar strategiskt beslutsfattande.

Bästa praxis för linjeavkänning

Att optimera siktlinjedetektering är avgörande för att upprätthålla en smidig spelupplevelse. Här är några bästa metoder att tänka på.

Raycast-frekvens

Undvik att utföra raycasts varje bildruta om det inte behövs. Överväg att kontrollera siktlinjen endast när spelarens position eller miljö förändras avsevärt. Detta hjälper till att minska onödiga beräkningar.

Ray Längd

Balansera längden på din raycast. Extremt långa strålar kan påverka prestandan, så välj en längd som täcker det nödvändiga området samtidigt som du håller beräkningsbelastningen i schack.

Kollisionslager

Använd kollisionslager och masker för att finjustera vilka objekt som siktlinjedetekteringen beaktar. Detta förhindrar onödiga strålkastningar till irrelevanta föremål.

Cachningsresultat

Om du utför samma siktavkänning för flera objekt eller ramar, överväg att cachelagra resultaten för att undvika överflödiga beräkningar.

Integration på plattformsnivå

Anpassa din mekanik för detektering av siktlinjer med nivådesignen för ditt plattformsspel. Tänk på omgivningens vertikalitet, olika plattformshöjder och potentiella hinder som kan hindra siktlinjen.

Se till att ditt detekteringssystem rymmer dessa nyanser för att skapa en sömlös och intuitiv spelarupplevelse.

Gör Godot-spel mer engagerande med siktlinjedetektering

Linjeavkänning ger djup och realism till din spelvärld. Spelare kan lägga strategi, dölja eller närma sig utmaningar på olika sätt baserat på deras synfält. Den här mekanikern kan förvandla ett enkelt plattformsspel till en mer uppslukande upplevelse, vilket gör spelet mer engagerande och minnesvärt.