init
This commit is contained in:
77
scripts/enemy.gd
Normal file
77
scripts/enemy.gd
Normal file
@@ -0,0 +1,77 @@
|
||||
extends Unit
|
||||
class_name Enemy
|
||||
|
||||
# Класс противника
|
||||
|
||||
@export var detection_range: float = 10.0
|
||||
@export var attack_range: float = 2.0
|
||||
@export var attack_damage: float = 10.0
|
||||
@export var attack_cooldown: float = 1.0
|
||||
|
||||
var target: Node3D = null
|
||||
var attack_timer: float = 0.0
|
||||
|
||||
func _ready():
|
||||
super._ready()
|
||||
|
||||
func _physics_process(delta):
|
||||
attack_timer -= delta
|
||||
|
||||
# Поиск цели (игрока)
|
||||
if target == null or not is_instance_valid(target):
|
||||
find_target()
|
||||
|
||||
# Движение к цели
|
||||
if target and is_instance_valid(target):
|
||||
var distance = global_position.distance_to(target.global_position)
|
||||
|
||||
if distance <= attack_range:
|
||||
# Атака - поворачиваемся к цели
|
||||
var look_direction = (target.global_position - global_position)
|
||||
look_direction.y = 0
|
||||
if look_direction.length() > 0.1:
|
||||
var angle = atan2(look_direction.x, look_direction.z)
|
||||
rotation.y = angle
|
||||
|
||||
if attack_timer <= 0:
|
||||
attack(target)
|
||||
attack_timer = attack_cooldown
|
||||
elif distance <= detection_range:
|
||||
# Преследование - поворачиваемся и бежим к цели
|
||||
var direction = (target.global_position - global_position).normalized()
|
||||
velocity.x = direction.x * speed
|
||||
velocity.z = direction.z * speed
|
||||
|
||||
# Поворачиваем врага в сторону цели
|
||||
var look_direction = (target.global_position - global_position)
|
||||
look_direction.y = 0
|
||||
if look_direction.length() > 0.1:
|
||||
var angle = atan2(look_direction.x, look_direction.z)
|
||||
rotation.y = angle
|
||||
else:
|
||||
# Остановка - не поворачиваемся
|
||||
velocity.x = move_toward(velocity.x, 0, speed)
|
||||
velocity.z = move_toward(velocity.z, 0, speed)
|
||||
else:
|
||||
# Остановка если нет цели
|
||||
velocity.x = move_toward(velocity.x, 0, speed)
|
||||
velocity.z = move_toward(velocity.z, 0, speed)
|
||||
|
||||
# Применяем гравитацию
|
||||
if not is_on_floor():
|
||||
velocity.y -= 9.8 * delta
|
||||
else:
|
||||
velocity.y = 0
|
||||
|
||||
super._physics_process(delta)
|
||||
|
||||
func find_target():
|
||||
# Ищем игрока в сцене
|
||||
var players = get_tree().get_nodes_in_group("player")
|
||||
if players.size() > 0:
|
||||
target = players[0]
|
||||
|
||||
func attack(target_unit: Node3D):
|
||||
# Атака цели
|
||||
if target_unit.has_method("take_damage"):
|
||||
target_unit.take_damage(attack_damage)
|
||||
Reference in New Issue
Block a user