Použijte tuto techniku ​​k vylepšení pohybu a chování nepřítele napodobením základního vidění.

Detekce přímé viditelnosti dodává vaší hře vrstvu složitosti díky mechanismu, který umožňuje postavám nebo předmětům vnímat své okolí. Tuto funkci můžete použít pro chování nepřátelské umělé inteligence, mechaniku viditelnosti hráče, stealth hru a další.

V Godot nabízí uzel RayCast2D jednoduchý a efektivní způsob, jak dosáhnout detekce přímé viditelnosti.

Nastavení hry Godot

Než se ponoříte do uzlů RayCast2D, nastavte základní 2D herní prostředí v Godot 4. Vytvořte přehrávač znak, který se může pohybovat pomocí vstupů z klávesnice a komunikovat s platformami.

Nejprve vytvořte scénu pro postavu hráče. Přidat CharacterBody2D uzel jako kořen scény. Uvnitř CharacterBody2D, přidat CollisionShape2D s obdélníkovým tvarem a Sprite2D pro vizuální reprezentaci postavy.

Kód použitý v tomto článku je k dispozici v tomto úložiště GitHub a můžete jej používat zdarma pod licencí MIT.

Zde je kód GDScript pro pohyb hráče:

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)

Nyní vytvořte nějaké platformy, se kterými bude hráč komunikovat. Můžeš použít StaticBody2D uzly s vhodnými kolizními tvary, které reprezentují platformy. Uspořádejte je ve scéně, abyste vytvořili platformové prostředí.

Nastavení RayCast2D

Chcete-li vytvořit detekci přímé viditelnosti, použijte RayCast2D uzel. Zde je návod, jak můžete přidat a RayCast2D uzel používající GDScript:

var raycast: RayCast2D

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

Ujistěte se, že jste tento skript připojili k CharacterBody2D uzel. Tento fragment kódu vytvoří nový RayCast2D uzel a připojí jej jako dítě k postavě hráče.

Poskytování vizuální zpětné vazby při interakci v přímé viditelnosti

Nyní můžete vytisknout zprávu, kdykoli se linie pohledu hráče protne s plošinou. Vrhněte paprsek z pozice hráče ve směru pohybu. Pokud se paprsek srazí s předmětem, znamená to, že hráč má přímou viditelnost na plošinu.

Přidejte následující kód do stejného skriptu:

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

raycast.target_position = Vector2(100, 0)

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

Zde je výstup:

Rozšíření funkčnosti RayCast2D

Existuje mnoho pokročilých funkcí, které můžete použít k výraznému vylepšení interaktivity a komplexnosti vaší hry.

get_collider()

Za použití get_collider() metodou, můžete přistupovat k prvnímu objektu protnutému paprskem. Metoda vrátí hodnotu null, pokud v cestě paprsku není žádný objekt. To je zvláště užitečné pro identifikaci konkrétního předmětu, na který má váš hráč zorný úhel.

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 vám může sdělit Resource ID (RID) prvního protínaného objektu:

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() Funkce vrátí ID tvaru prvního protínaného objektu nebo 0, pokud nedojde ke kolizi.

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

Chcete-li lépe porozumět interakci, get_collision_normal() vám poskytne normálu tvaru v bodě kolize. V případech, kdy paprsek začíná uvnitř tvaru a hit_from_inside je pravda, bude normální návrat Vector2(0; 0).

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

get_collision_point()

Když paprsek protne objekt, get_collision_point() vrátí přesný bod kolize v globálních souřadnicích.

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

Pomocí těchto pokročilých schopností RayCast2D uzlu, můžete získat kritický pohled na interakce mezi paprskem a kolidujícími objekty.

Tyto metody vám umožňují shromažďovat základní informace, které mohou významně ovlivnit herní mechanismy, interakce s předměty a zpětnou vazbu hráčů.

Včetně dalších funkcí

Kromě základní funkce detekce přímé viditelnosti můžete dále zlepšit dynamiku hry implementací některých pokročilých funkcí.

Spouštěče událostí

Namísto pouhého tisku zprávy můžete spustit konkrétní události ve hře. Například odhalení skrytých cest, aktivace mechanismů nebo upozornění nepřátel na přítomnost hráče může přidat hloubku vaší hře.

Dynamická manipulace s překážkami

Zvažte scénáře, kde překážky mohou bránit linii výhledu. Implementace dynamické detekce překážek zajišťuje, že se linie zorného pole aktualizuje v reálném čase, jak se objekty pohybují dovnitř a ven z pohledu hráče.

Vlastní vizuální indikátory

Namísto spoléhání se pouze na text můžete vytvořit vlastní vizuální indikátory, které zvýrazní přítomnost interakcí v přímé viditelnosti. To může zahrnovat změnu barvy přehrávače nebo objektového spritu, zobrazení ikony, popř animace příslušných prvků.

Mechanika mlhy války

U strategických her nebo her zaměřených na průzkum můžete zavést mechanismy fog of war. To omezuje hráčovu vizi, dokud si nevytvoří linii pohledu, odhaluje herní svět postupně a podporuje strategické rozhodování.

Nejlepší postupy pro detekci přímé viditelnosti

Optimalizace detekce přímé viditelnosti je zásadní pro udržení hladkého herního zážitku. Zde je několik doporučených postupů, které je třeba mít na paměti.

Raycast frekvence

Vyhněte se provádění raycastů každý snímek, pokud to není nutné. Zvažte kontrolu přímé viditelnosti pouze tehdy, když se výrazně změní pozice hráče nebo prostředí. To pomáhá omezit zbytečné výpočty.

Délka paprsku

Vyrovnejte délku vašeho raycastu. Extrémně dlouhé paprsky mohou ovlivnit výkon, proto zvolte délku, která pokryje nezbytnou plochu a zároveň udrží výpočetní zátěž pod kontrolou.

Kolizní vrstvy

Pomocí vrstev a masek kolizí dolaďte, které objekty detekce přímé viditelnosti bere v úvahu. Tím se zabrání zbytečnému raycastu na irelevantní objekty.

Výsledky ukládání do mezipaměti

Pokud provádíte stejnou detekci přímky pro několik objektů nebo snímků, zvažte uložení výsledků do mezipaměti, abyste se vyhnuli nadbytečným výpočtům.

Integrace na úrovni platformy

Srovnejte svou mechaniku detekce přímé viditelnosti s úrovní designu vaše plošinovka. Zvažte vertikalitu prostředí, různé výšky plošin a potenciální překážky, které by mohly bránit linii výhledu.

Zajistěte, aby váš detekční systém vyhovoval těmto nuancím a vytvořil bezproblémový a intuitivní hráčský zážitek.

Díky detekci přímé viditelnosti budou hry Godot poutavější

Detekce přímé viditelnosti dodává vašemu hernímu světu hloubku a realismus. Hráči mohou strategicky, skrývat nebo přistupovat k výzvám odlišně na základě jejich zorného úhlu. Tato mechanika dokáže proměnit jednoduchou plošinovku ve více pohlcující zážitek, díky kterému bude hra poutavější a zapamatovatelnější.