49 lines
1.4 KiB
GDScript
49 lines
1.4 KiB
GDScript
extends CharacterBody3D
|
|
|
|
class_name AIBase
|
|
|
|
@export var speed: float = 4.0
|
|
@export var enable_state_machine: bool = true:
|
|
set(value):
|
|
enable_state_machine = value
|
|
toggle_enable_state_machine()
|
|
|
|
|
|
@onready var patrol_radius_shape: CollisionShape3D = $%PatrolRadiusShape
|
|
@onready var nav_agent: NavigationAgent3D = $%NavigationAgent3D
|
|
@onready var state_machine: StateMachine = $%StateMachine
|
|
|
|
|
|
func _ready() -> void:
|
|
randomize()
|
|
toggle_enable_state_machine()
|
|
|
|
func toggle_enable_state_machine() -> void:
|
|
state_machine.enable = enable_state_machine
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if !enable_state_machine:
|
|
return
|
|
|
|
state_machine.physics_process(delta)
|
|
|
|
if nav_agent.is_navigation_finished():
|
|
velocity = Vector3.ZERO
|
|
move_and_slide()
|
|
return
|
|
|
|
var next_point = nav_agent.get_next_path_position()
|
|
var direction = global_position.direction_to(next_point)
|
|
|
|
velocity.x = direction.x * speed
|
|
velocity.z = direction.z * speed
|
|
|
|
move_and_slide()
|
|
|
|
func navigate_to_random_point() -> void:
|
|
var nav_map_rid = get_world_3d().get_navigation_map()
|
|
var patrol_radius = patrol_radius_shape.shape.radius
|
|
var target_point_in_space = global_position + Vector3(randf_range(-1, 1), 0, randf_range(-1, 1)).normalized() * randf_range(0, patrol_radius)
|
|
var closest_valid_point = NavigationServer3D.map_get_closest_point(nav_map_rid, target_point_in_space)
|
|
nav_agent.target_position = closest_valid_point
|