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

Обнаружение прямой видимости усложняет вашу игру благодаря механизму, который позволяет персонажам или объектам воспринимать свое окружение. Вы можете использовать эту функцию для определения поведения ИИ противника, механики видимости игроков, скрытного игрового процесса и многого другого.

В Godot узел RayCast2D предлагает простой и эффективный способ обнаружения прямой видимости.

Настройка игры «Годо»

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

Сначала создайте сцену для персонажа игрока. Добавить Тело персонажа2D узел как корень сцены. Внутри Тело персонажа2D, добавить СтолкновениеShape2D прямоугольной формы и Спрайт2D для визуального представления персонажа.

Код, используемый в этой статье, доступен в этом Репозиторий GitHub и вы можете бесплатно использовать его по лицензии MIT.

Вот код 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

Чтобы создать обнаружение прямой видимости, используйте РэйКаст2D узел. Вот как вы можете добавить РэйКаст2D узел с использованием GDScript:

var raycast: RayCast2D

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

Обязательно прикрепите этот скрипт к Тело персонажа2D узел. Этот фрагмент кода создает новый РэйКаст2D node и присоединяет его как дочерний к персонажу игрока.

Обеспечение визуальной обратной связи при взаимодействии на линии прямой видимости

Теперь вы можете распечатать сообщение всякий раз, когда линия обзора игрока пересекается с платформой. Направьте луч из позиции игрока по направлению движения. Если луч сталкивается с объектом, это означает, что у игрока есть прямая видимость платформы.

Добавьте следующий код в тот же скрипт:

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() метод, вы можете получить доступ к первому объекту, пересекаемому лучом. Метод возвращает значение null, если на пути луча нет объекта. Это особенно полезно для определения конкретного объекта, на который ваш игрок имеет прямую видимость.

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

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

get_collider_rid()

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

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() предоставляет вам нормаль формы в точке столкновения. В тех случаях, когда луч начинается внутри формы и hit_from_inside верно, нормальный возврат будет Вектор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)

Используя эти расширенные возможности РэйКаст2D node, вы можете получить ценную информацию о взаимодействии луча и сталкивающихся объектов.

Эти методы позволяют вам собирать важную информацию, которая может существенно повлиять на игровую механику, взаимодействие объектов и отзывы игроков.

Включая дополнительные функции

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

Триггеры событий

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

Динамическая обработка препятствий

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

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

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

Механика тумана войны

Для стратегических или исследовательских игр вы можете ввести механику тумана войны. Это ограничивает обзор игрока до тех пор, пока он не установит линию обзора, постепенно раскрывая игровой мир и поощряя принятие стратегических решений.

Лучшие практики для обнаружения прямой видимости

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

Частота рейкаста

Избегайте выполнения raycasts в каждом кадре, если в этом нет необходимости. Проверку прямой видимости рекомендуется проверять только в том случае, если положение игрока или окружающая среда существенно меняются. Это помогает сократить ненужные вычисления.

Длина луча

Сбалансируйте длину вашего рейкаста. Чрезвычайно длинные лучи могут повлиять на производительность, поэтому выбирайте длину, которая покрывает необходимую площадь, сохраняя при этом вычислительную нагрузку.

Слои столкновений

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

Кэширование результатов

Если вы выполняете одно и то же обнаружение прямой видимости для нескольких объектов или кадров, рассмотрите возможность кэширования результатов, чтобы избежать избыточных вычислений.

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

Согласуйте свою механику обнаружения прямой видимости с дизайном уровней твой платформер. Учитывайте вертикальность окружающей среды, различную высоту платформы и потенциальные препятствия, которые могут затруднить обзор.

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

Делаем игры Godot более интересными благодаря обнаружению прямой видимости

Обнаружение прямой видимости добавляет глубину и реалистичность вашему игровому миру. Игроки могут разрабатывать стратегию, прятаться или подходить к задачам по-разному в зависимости от угла обзора. Эта механика может превратить простой платформер в более захватывающий опыт, сделав игровой процесс более увлекательным и запоминающимся.