Използвайте тази техника, за да подобрите движението и поведението на врага чрез емулиране на основна визия.

Откриването на пряка видимост добавя слой сложност към вашата игра с механизъм, който позволява на героите или обектите да възприемат заобикалящата ги среда. Можете да използвате тази функция за поведение на AI на врага, механика за видимост на играча, стелт игра и др.

В Godot възелът RayCast2D предлага прост и ефективен начин за постигане на откриване на линия на видимост.

Настройване на играта Godot

Преди да се потопите в възлите на RayCast2D, настройте основна среда за 2D игра в Godot 4. Създайте играч знак, който може да се движи с помощта на въвеждане от клавиатурата и взаимодействат с платформи.

Първо създайте сцена за героя на играча. Добави CharacterBody2D възел като корен на сцената. Вътре в CharacterBody2D, добави CollisionShape2D с форма на правоъгълник и a Sprite2D за визуално представяне на героя.

Кодът, използван в тази статия, е достъпен в това GitHub хранилище и е безплатен за използване под лиценза на MIT.

instagram viewer

Ето кода на GDScript за движението на играча:

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)

Сега създайте няколко платформи, с които играчът да взаимодейства. Можеш да използваш Статично тяло2D възли с подходящи форми на сблъсък, за да представят платформите. Подредете ги в сцената, за да създадете среда за платформинг.

Настройване на RayCast2D

За да създадете откриване на пряка видимост, използвайте RayCast2D възел. Ето как можете да добавите a RayCast2D възел, използващ GDScript:

var raycast: RayCast2D

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

Не забравяйте да прикачите този скрипт към CharacterBody2D възел. Този кодов фрагмент създава нов RayCast2D възел и го прикрепя като дете към героя на играча.

Осигуряване на визуална обратна връзка при взаимодействие при пряка видимост

Сега можете да отпечатате съобщение винаги, когато линията на видимост на играча се пресича с платформа. Хвърлете лъч от позицията на играча по посока на движението. Ако лъчът се сблъска с обект, това означава, че играчът има линия на видимост към платформа.

Добавете следния код към същия скрипт:

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

raycast.target_position = Vector2(100, 0)

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

Ето изхода:

Разширяване на функционалността на RayCast2D

Има много разширени функции, които можете да използвате, за да подобрите значително интерактивността и сложността на вашата игра.

get_collider()

Използвайки get_collider() можете да получите достъп до първия обект, пресечен от лъча. Методът връща нула, ако няма обект по пътя на лъча. Това е особено полезно за идентифициране на конкретния обект, към който вашият играч има пряка видимост.

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() може да ви каже идентификатора на ресурса (RID) на първия пресечен обект:

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() функцията връща идентификатора на формата на първия пресечен обект или 0, ако не възникне сблъсък.

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

За да разберете по-добре взаимодействието, get_collision_normal() ви предоставя нормалата на формата в точката на сблъсък. В случаите, когато лъчът започва във формата и удар_от_вътре е вярно, нормалното върнато ще бъде Вектор2(0, 0).

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

get_collision_point()

Когато лъчът пресича обект, get_collision_point() връща точната точка на сблъсък в глобални координати.

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

Използвайки тези разширени възможности на RayCast2D възел, можете да получите критична представа за взаимодействията между лъча и сблъскващи се обекти.

Тези методи ви дават възможност да събирате съществена информация, която може значително да повлияе на механиката на играта, взаимодействията на обектите и обратната връзка на играчите.

Включително допълнителни функции

Освен основната функционалност за откриване на пряка видимост, можете допълнително да подобрите динамиката на играта си, като внедрите някои разширени функции.

Тригери за събития

Вместо просто да отпечатате съобщение, можете да задействате конкретни събития в играта. Например разкриването на скрити пътеки, активирането на механизми или предупреждаването на врагове за присъствието на играча може да добави дълбочина към вашия геймплей.

Динамично управление на препятствия

Обмислете сценарии, при които препятствията могат да възпрепятстват линията на видимост. Внедряването на динамично откриване на препятствия гарантира, че линията на видимост се актуализира в реално време, когато обектите се движат навътре и извън изгледа на играча.

Персонализирани визуални индикатори

Вместо да разчитате единствено на текст, можете да създадете персонализирани визуални индикатори, за да подчертаете наличието на взаимодействия в пряка видимост. Това може да включва промяна на цвета на спрайта на играча или обекта, показване на икона или анимиране на съответните елементи.

Мъглата на военната механика

За игри, фокусирани върху стратегия или изследване, можете да въведете механика на мъглата на войната. Това ограничава визията на играча, докато не установи линия на видимост, разкривайки света на играта постепенно и насърчавайки вземането на стратегически решения.

Най-добри практики за откриване на пряка видимост

Оптимизирането на откриването на пряка видимост е от решаващо значение за поддържането на плавна игра. Ето някои най-добри практики, които трябва да имате предвид.

Честота на Raycast

Избягвайте да извършвате raycasts на всеки кадър, ако не е необходимо. Помислете за проверка за пряка видимост само когато позицията на играча или средата се промени значително. Това помага за намаляване на ненужните изчисления.

Дължина на лъча

Балансирайте дължината на вашето излъчване. Изключително дългите лъчи могат да повлияят на производителността, така че изберете дължина, която покрива необходимата област, като същевременно поддържа изчислителното натоварване под контрол.

Слоеве на сблъсък

Използвайте слоеве и маски за сблъсък, за да настроите фино кои обекти отчита откриването на линията на видимост. Това предотвратява ненужни прехвърляния към неподходящи обекти.

Кеширане на резултатите

Ако извършвате едно и също откриване на линия на видимост за няколко обекта или рамки, помислете за кеширане на резултатите, за да избегнете излишни изчисления.

Интеграция на ниво платформинг

Подравнете вашата механика за откриване на пряка видимост с дизайна на нивото на вашата игра на платформинг. Помислете за вертикалността на околната среда, различните височини на платформата и потенциалните препятствия, които биха могли да попречат на линията на видимост.

Уверете се, че вашата система за откриване се приспособява към тези нюанси, за да създаде безпроблемно и интуитивно изживяване на играча.

Правим Godot Games по-ангажиращи с откриване на линия на видимост

Откриването на пряка видимост добавя дълбочина и реализъм към вашия свят на игри. Играчите могат да разработват стратегии, да се крият или да подхождат към предизвикателствата по различен начин в зависимост от тяхната линия на зрение. Тази механика може да превърне прост платформинг в по-завладяващо изживяване, правейки играта по-ангажираща и запомняща се.