53 lines
1.7 KiB
GDScript
53 lines
1.7 KiB
GDScript
extends Node
|
|
|
|
const SPEED := 3.0
|
|
const LEASH_RANGE := 15.0
|
|
const ATTACK_RANGE := 2.0
|
|
|
|
@onready var enemy: CharacterBody3D = get_parent()
|
|
@onready var nav_agent: NavigationAgent3D = get_parent().get_node("NavigationAgent3D")
|
|
|
|
func _physics_process(_delta: float) -> void:
|
|
match enemy.state:
|
|
enemy.State.IDLE:
|
|
enemy.velocity.x = 0
|
|
enemy.velocity.z = 0
|
|
enemy.State.CHASE:
|
|
_chase()
|
|
enemy.State.RETURN:
|
|
_return_to_spawn()
|
|
|
|
func _chase() -> void:
|
|
if not is_instance_valid(enemy.target):
|
|
enemy.state = enemy.State.RETURN
|
|
return
|
|
var dist_to_spawn := enemy.global_position.distance_to(enemy.spawn_position)
|
|
if dist_to_spawn > LEASH_RANGE:
|
|
enemy.state = enemy.State.RETURN
|
|
enemy.target = null
|
|
return
|
|
var dist_to_target := enemy.global_position.distance_to(enemy.target.global_position)
|
|
if dist_to_target <= ATTACK_RANGE:
|
|
enemy.state = enemy.State.ATTACK
|
|
return
|
|
nav_agent.target_position = enemy.target.global_position
|
|
var next_pos := nav_agent.get_next_path_position()
|
|
var direction := (next_pos - enemy.global_position).normalized()
|
|
direction.y = 0
|
|
enemy.velocity.x = direction.x * SPEED
|
|
enemy.velocity.z = direction.z * SPEED
|
|
|
|
func _return_to_spawn() -> void:
|
|
var dist := enemy.global_position.distance_to(enemy.spawn_position)
|
|
if dist < 1.0:
|
|
enemy.state = enemy.State.IDLE
|
|
enemy.velocity.x = 0
|
|
enemy.velocity.z = 0
|
|
return
|
|
nav_agent.target_position = enemy.spawn_position
|
|
var next_pos := nav_agent.get_next_path_position()
|
|
var direction := (next_pos - enemy.global_position).normalized()
|
|
direction.y = 0
|
|
enemy.velocity.x = direction.x * SPEED
|
|
enemy.velocity.z = direction.z * SPEED
|