Оглавление
Проблема
Вы хотите, чтобы враг преследовал игрока.
Решение
Первый шаг для того, чтобы враг преследовал игрока, — определить, в каком направлении враг должен двигаться. Чтобы получить вектор, указывающий от точки A к точке B, нужно вычесть: B — A. Нормализуйте результат, и вы получите вектор направления.
Это делает решение довольно простым. Каждый кадр задавайте скорость врага так, чтобы она указывала в направлении игрока.
velocity = (player.position - position).normalized() * speed
В Godot объект Vector2 имеет встроенную функцию для этого:
velocity = position.direction_to(player.position) * speed
Однако это позволит врагу преследовать игрока с любого расстояния, даже если он далеко. Чтобы исправить это, можно добавить к врагу Area2D
и преследовать игрока только тогда, когда он находится внутри этого «радиуса обнаружения».


Вот пример кода:
extends CharacterBody2D
var run_speed = 25
var player = null
func _physics_process(delta):
velocity = Vector2.ZERO
if player:
velocity = position.direction_to(player.position) * run_speed
move_and_slide()
func _on_DetectRadius_body_entered(body):
player = body
func _on_DetectRadius_body_exited(body):
player = null
Проверь свои знания в нашем бесплатном ТЕСТЕ по Godot! Узнай, насколько хорошо ты его знаешь!
Мы подключили сигналы body_entered
и body_exited
от Area2D
, чтобы враг знал, находится ли игрок в радиусе или нет.
Примечание
Вышеизложенное предполагает, что игрок — единственный объект, который будет входить/выходить, что обычно делается путем настройки соответствующих слоев и масок коллизий.
Эта концепция может быть расширена и для других типов игр. Главное — найти вектор направления от врага к игроку:
Если, например, ваша игра — это платформер или имеет другие ограничения в движении, вы можете использовать только x-компоненту результирующего вектора для определения движения.
Ограничения
Этот метод приводит к очень простому движению по прямой. Враг не будет обходить препятствия, такие как стены, и не остановится, если окажется слишком близко к игроку.
Что делать, когда враг приближается к игроку, зависит от вашей игры. Вы можете добавить вторую, меньшую область, которая заставит врага остановиться и атаковать, или оттолкнуть игрока при контакте.
Другая проблема более заметна с быстро движущимися врагами. Когда игрок движется, враги, использующие эту технику, будут мгновенно менять направление. Для более естественного движения можно использовать алгоритмы управления.