Koristite ovu tehniku ​​da poboljšate kretanje i ponašanje neprijatelja oponašanjem osnovne vizije.

Line-of-sight detekcija dodaje sloj složenosti vašoj igri s mehanizmom koji omogućuje likovima ili objektima da percipiraju svoje okruženje. Ovu značajku možete koristiti za neprijateljsko AI ponašanje, mehaniku vidljivosti igrača, nevidljivo igranje i još mnogo toga.

U Godotu, čvor RayCast2D nudi jednostavan i učinkovit način za postizanje detekcije linije vidljivosti.

Postavljanje igre Godot

Prije nego što zaronite u RayCast2D čvorove, postavite osnovno okruženje 2D igre u Godotu 4. Stvorite igrača lik koji se može kretati pomoću unosa s tipkovnice i komunicirati s platformama.

Prvo stvorite scenu za lik igrača. Dodati CharacterBody2D čvor kao korijen scene. Unutar CharacterBody2D, dodati CollisionShape2D s oblikom pravokutnika i a Sprite2D za vizualni prikaz lika.

Kôd korišten u ovom članku dostupan je u ovom GitHub spremište i besplatan je za korištenje pod MIT licencom.

Evo GDScript koda za kretanje igrača:

instagram viewer
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)

Sada stvorite neke platforme za interakciju igrača. Možeš koristiti StaticBody2D čvorovi s odgovarajućim kolizijskim oblicima koji predstavljaju platforme. Rasporedite ih u scenu kako biste stvorili platformsko okruženje.

Postavljanje RayCast2D

Da biste stvorili otkrivanje linije vidljivosti, koristite RayCast2D čvor. Evo kako možete dodati a RayCast2D čvor koji koristi GDScript:

var raycast: RayCast2D

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

Obavezno priložite ovu skriptu na CharacterBody2D čvor. Ovaj isječak koda stvara novi RayCast2D čvor i pridaje ga kao dijete liku igrača.

Pružanje vizualnih povratnih informacija o interakciji u liniji vidljivosti

Sada možete ispisati poruku kad god se igračev vidokrug presijeca s platformom. Bacite zraku s pozicije igrača u smjeru kretanja. Ako se zraka sudari s objektom, to znači da igrač ima liniju vidljivosti prema platformi.

Istoj skripti dodajte sljedeći kod:

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

raycast.target_position = Vector2(100, 0)

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

Evo rezultata:

Proširenje RayCast2D funkcionalnosti

Postoje mnoge napredne značajke pomoću kojih možete značajno poboljšati interaktivnost i složenost svoje igre.

get_collider()

Koristiti get_collider() možete pristupiti prvom objektu koji presječe zraka. Metoda vraća null ako nijedan objekt nije na putanji zrake. Ovo je osobito korisno za prepoznavanje specifičnog objekta koji vaš igrač ima u vidokrugu.

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

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

get_collider_rid()

The get_collider_rid() metoda vam može reći ID resursa (RID) prvog presječenog objekta:

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

The get_collider_shape() funkcija vraća ID oblika prvog presječenog objekta ili 0 ako ne dođe do sudara.

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

Da bismo bolje razumjeli interakciju, get_collision_normal() daje vam normalu oblika u točki sudara. U slučajevima kada zraka počinje unutar oblika i udar_iznutra je istina, normalno vraćeno će biti Vektor2(0, 0).

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

get_collision_point()

Kada zraka siječe objekt, get_collision_point() vraća točnu točku sudara u globalnim koordinatama.

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

Koristeći ove napredne mogućnosti RayCast2D čvor, možete steći kritične uvide u interakcije između zrake i objekata koji se sudaraju.

Ove vam metode omogućuju prikupljanje bitnih informacija koje mogu značajno utjecati na mehaniku igranja, interakcije objekata i povratne informacije igrača.

Uključujući dodatne značajke

Kao i temeljnu funkciju otkrivanja linije vidljivosti, možete dodatno poboljšati dinamiku svoje igre implementacijom nekih naprednih značajki.

Okidači događaja

Umjesto da samo ispisujete poruku, možete pokrenuti određene događaje u igri. Na primjer, otkrivanje skrivenih staza, aktiviranje mehanizama ili upozoravanje neprijatelja na prisutnost igrača može dodati dubinu vašem igranju.

Dinamičko rukovanje preprekama

Razmotrite scenarije u kojima prepreke mogu ometati vidokrug. Implementacija dinamičkog otkrivanja prepreka osigurava da se vidokrug ažurira u stvarnom vremenu kako se objekti kreću ui izvan igračevog pogleda.

Prilagođeni vizualni indikatori

Umjesto da se oslanjate samo na tekst, možete izraditi prilagođene vizualne indikatore kako biste istaknuli prisutnost interakcija u neposrednoj vidljivosti. To može uključivati ​​promjenu boje spritea igrača ili objekta, prikazivanje ikone ili animiranje relevantnih elemenata.

Magla ratne mehanike

Za strategije ili igre usmjerene na istraživanje možete uvesti mehaniku magle rata. To ograničava igračevu viziju sve dok ne uspostavi liniju vidljivosti, postupno otkrivajući svijet igre i potičući donošenje strateških odluka.

Najbolji primjeri iz prakse za otkrivanje linije vidljivosti

Optimiziranje detekcije linije vidljivosti presudno je za održavanje glatkog iskustva igranja. Evo nekoliko najboljih praksi koje morate imati na umu.

Raycast frekvencija

Izbjegavajte izvođenje raycasta za svaki okvir ako nije potrebno. Razmotrite provjeru linije vidljivosti samo kada se položaj igrača ili okolina značajno promijene. To pomaže u smanjenju nepotrebnih izračuna.

Duljina zraka

Uravnotežite duljinu vašeg raycasta. Ekstremno duge zrake mogu utjecati na izvedbu, stoga odaberite duljinu koja pokriva potrebno područje, a istovremeno održava računsko opterećenje pod kontrolom.

Slojevi sudara

Upotrijebite slojeve sudara i maske za fino podešavanje objekata koje otkrivanje linije vidljivosti uzima u obzir. Ovo sprječava nepotrebno emitiranje zraka na nebitne objekte.

Predmemoriranje rezultata

Ako provodite isto otkrivanje vidnog polja za nekoliko objekata ili okvira, razmislite o spremanju rezultata u predmemoriju kako biste izbjegli suvišne izračune.

Integracija na razini platforme

Uskladite svoju mehaniku detekcije linije vidljivosti s dizajnom razine vaša platformska igra. Uzmite u obzir okomitost okoline, različite visine platforme i potencijalne prepreke koje bi mogle ometati vidokrug.

Pobrinite se da vaš sustav detekcije odgovara ovim nijansama kako biste stvorili besprijekorno i intuitivno iskustvo igrača.

Činimo igre Godot zanimljivijima s otkrivanjem linije vidljivosti

Line-of-sight detekcija dodaje dubinu i realizam u vaš svijet igre. Igrači mogu osmisliti strategiju, sakriti se ili drugačije pristupiti izazovima ovisno o svojoj liniji gledanja. Ova mehanika može jednostavnu platformersku igru ​​pretvoriti u impresivnije iskustvo, čineći igru ​​privlačnijom i nezaboravnijom.