Contents

Hur man använder RayCast2D-noder för siktlinjedetektering i Godot

Siktlinjedetektering ger ditt spel ett lager av komplexitet med en mekanism som låter karaktärer eller objekt uppfatta sin omgivning. Du kan använda den här funktionen för fiende-AI, mekanik för spelares synlighet, smygspel och mycket mer.

I Godot är implementeringen av siktlinjedetektering genom användning av RayCast2D-noden både strömlinjeformad och resursstark.

Konfigurera Godot-spelet

För att börja arbeta med RayCast2D-noder i Godot är det först nödvändigt att skapa en grundläggande tvådimensionell spelmiljö. Detta inkluderar att skapa en spelkaraktär som kan förflytta sig med hjälp av tangentbordet, samt möjligheten för karaktären att interagera med olika plattformar i spelvärlden.

För att börja designa spelkaraktären i Unity, följ dessa steg:1. Skapa en tom scen genom att högerklicka i projektfönstret och välja “Scen”. Ge den ett namn som “PlayerCharacter” eller liknande.2. Dra ett nytt GameObject till panelen Hierarki i den nyskapade scenen. Detta kommer att fungera som rotobjekt för vår spelarkaraktär.3. Med rotobjektet markerat går du till Inspector-panelen och klickar på knappen “Lägg till komponent” längst ner. I listan över tillgängliga komponenter väljer du “CharacterController2D” och klickar på “Lägg till”. Denna komponent är nödvändig för alla 2D-karaktärsrörelser i Unity.4. Dra sedan ett annat GameObject till Hierarchy-panelen från Assets-panelen. Den här gången väljer du pre

Den medföljande koden kan nås via ett GitHub-arkiv, som fungerar som en plattform med öppen källkod för utvecklare att dela sitt arbete med andra. Den här specifika koduppsättningen är licensierad enligt villkoren i MIT-licensen, vilket ger användarna tillstånd att använda den utan kostnad.

Den medföljande GDScript-koden avser spelarrörelsen, vilket indikeras av dess titel. Den innehåller en funktion med namnet “move” som verkar vara ansvarig för att hantera karaktärens rörelse baserat på användarens inmatning och andra faktorer som hoppning och klättring. Koden använder också variabler inklusive horisontell och vertikal hastighet, acceleration, gravitation och mer.

 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)

För att underlätta interaktionen mellan spelaren och spelvärlden är det nödvändigt att utveckla en serie interaktiva plattformar i scenen. Dessa kan konstrueras med hjälp av StaticBody2D-komponenter, som erbjuder olika alternativ för att definiera objektets form. Genom att arrangera dessa element på ett genomtänkt sätt kan vi effektivt skapa en uppslukande plattformsupplevelse för användaren.

/sv/images/simple-los-in-godot.jpg

Konfigurera RayCast2D

För att integrera siktlinjedetektering i ditt projekt med Unity3D och GDScript, följ dessa steg för att integrera noden Raycast2D från Godot Engine:

 var raycast: RayCast2D

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

Se till att du fäster detta skript till

Ge visuell feedback på siktlinjeinteraktion

Du kan nu skapa ett meddelande när spelarens visuella axel korsar en yta genom att avge en ljusstråle från deras nuvarande plats och rikta den mot deras avsedda bana. Om denna stråle träffar en enhet innebär det att spelaren kan uppfatta plattformen inom sitt synfält.

Införliva den ovan nämnda koden i det befintliga skriptet enligt följande:

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

    raycast.target_position = Vector2(100, 0)

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

Här är resultatet:

/sv/images/simple-raycast-in-godot.jpg

Utöka RayCast2D:s funktionalitet

Att använda en mängd innovativa funktioner är avgörande för att höja nivån på interaktion och komplexitet i ens spel till en exceptionell grad.

get_collider()

Med hjälp av funktionen get_collider() kan man hämta det första objektet som strålen stöter på. Om inget objekt ligger inom strålens bana kommer denna metod att returnera null, vilket ger värdefull information om att det inte finns något hinder i spelarens siktlinje.

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

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

get_collider_rid()

Funktionen get_collider_rid() möjliggör hämtning av resurs-ID (RID) som motsvarar det första kolliderade objektet inom ett kollisionsdetekteringssystem, vilket ger värdefull information för att avgöra vilka objekt som har kommit i kontakt under spel eller andra interaktiva tillämpningar.

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

Funktionen get_collider_shape() hämtar den unika identifierare som är kopplad till den geometriska formen hos det första överlappande objektet, eller noll (0) om en kollision inte 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å en djupare förståelse för interaktionen kan man använda funktionen get_collision_normal() som ger normalvektorn för objektet vid kollisionspunkten. När strålen kommer inifrån formen och villkoret hit_from_inside är uppfyllt, kommer den normal som returneras av denna funktion att representeras som en Vector2 instans med ett x-värde på noll och ett y-värde på noll.

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

get_collision_point()

Funktionen get\_collision\_point() fastställer exakt den punkt där kollisionen inträffar inom ett globalt definierat koordinatsystem när den stöter på ett objekt som den kolliderar med.

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

Genom att utnyttja de intrikata funktionerna i RayCast2D-modulen kan man få ovärderlig förståelse för samspelet mellan den projicerade strålen och hindrande enheter i scenen.

Användningen av dessa tekniker gör det möjligt att samla in viktiga data som har potential att i hög grad påverka spelmekanik, objektinteraktivitet och användarupplevelse.

Inkludera ytterligare funktioner

Förutom grundläggande funktioner för att upptäcka siktlinjer kan man förbättra ett spels dynamiska element genom att integrera mer avancerade funktioner.

Händelsetriggers

Istället för att bara visa ett meddelande är det möjligt att initiera särskilda händelser i spelet. Till exempel kan dolda vägar avslöjas, maskiner aktiveras eller motståndarna meddelas om var spelaren befinner sig, vilket kan förbättra spelupplevelsen.

Dynamisk hantering av hinder

För att ta hänsyn till potentiella störningar i siktlinjen är det viktigt att införliva en mekanism för att dynamiskt upptäcka eventuella hinder som kan försvåra den visuella mottagningen. På så sätt kan siktlinjen justeras i realtid när föremål kommer in i eller lämnar användarens synfält.

Anpassade visuella indikatorer

För att förstärka traditionella textuella signaler kan man utveckla anpassade visuella signaler som betonar siktlinjer mellan spelare och objekt. Sådana förbättringar kan inkludera att ändra färgtonen på en karaktärs eller ett objekts sprite, visa en symbolisk representation eller aktivera animerade komponenter som är relevanta för dessa relationer.

Fog of War-mekanik

För att förbättra upplevelsen i strategiorienterade spel rekommenderas att Fog of War-mekanik implementeras. Dessa mekaniker begränsar spelarens synlighet tills en siktlinje har upprättats, vilket gradvis avslöjar spelvärlden och främjar genomtänkta strategiska val.

Bästa praxis för siktlinjedetektering

Optimering av siktlinjedetektering (LOS) är avgörande för att säkerställa sömlöst spelande, eftersom det hjälper till att förhindra hinder och säkerställa att spelare kan se vad de behöver interagera med eller navigera runt på ett effektivt sätt. Genom att följa dessa bästa metoder kan du uppnå detta mål:

Raycast Frequency

Avstå från att utföra raycasts konstant i varje iteration, såvida det inte är absolut nödvändigt. Överväg istället att undersöka synligheten endast när spelarens vistelseort eller scenen genomgår en betydande förändring. På så sätt kan du minimera onödiga beräkningar och optimera prestandan.

Ray Length

Säkerställ optimal prestanda genom att justera längden på din raycast så att den endast täcker den nödvändiga regionen utan att orsaka överdrivna beräkningar. Alltför långa strålar kan påverka effektiviteten negativt, därför är det viktigt att hitta en balans mellan täckning och beräkningsbörda.

Kollisionslager

Använd kollisionslager och masker för att förfina omfattningen av objekt som beaktas för siktlinjedetektering, vilket förhindrar ovidkommande strålar riktade mot obetydliga enheter.

Cachelagra resultat

När du utför flera instanser av siktlinjeanalys på olika objekt eller inom på varandra följande bildrutor, är det lämpligt att lagra resultatet i en cache för att förhindra onödiga beräkningar.

Integration av plattformsnivåer

Se till att spelets system för siktlinjedetektering är sammanhängande med plattformsnivåernas design genom att ta hänsyn till faktorer som omgivningens vertikalitet, varierande plattformshöjder och eventuella hinder för synskärpa i miljön.

Se till att ditt detekteringssystem kan ta hänsyn till de subtila detaljer som finns i spelet, för att underlätta en lätt sammanhängande och användarvänlig upplevelse för spelarna.

Gör Godot-spel mer engagerande med siktlinjedetektering

Siktlinjedetektering förbättrar spelmiljöns djup och verklighet genom att låta spelarna planera, gömma sig eller hantera hinder på olika sätt beroende på deras visuella perspektiv. Genom att införliva detta element kan utvecklare förvandla ett vanligt plattformsspel till en mer fängslande och uppslukande upplevelse som ökar spelarnas engagemang och skapar bestående minnen.