pretty happy with basic AI behavior

This commit is contained in:
derek
2025-04-29 11:02:12 -05:00
parent ccb4781460
commit a287710a7b
10 changed files with 86 additions and 75 deletions

View File

@@ -15,6 +15,7 @@ var visibility_timer
func Enter():
super()
enemy.cache_player_pos()
visibility_timer = time_before_losing_visual
update_waypoint()
enemy.turret_material.emission_enabled = true
@@ -31,6 +32,8 @@ func current_target():
return enemy.point_of_interest
func Update(delta):
enemy.cache_player_pos()
if !enemy.is_player_visible():
if visibility_timer > 0:
visibility_timer -= delta
@@ -73,9 +76,7 @@ func Physics_Update(delta):
var direction = local_destination.normalized()
if enemy.global_position.distance_to(local_destination) > 1:
enemy.velocity = direction * move_speed
enemy.spider_look_next.look_at(destination)
var look_target = enemy.spider_look_next.global_rotation.y
enemy.global_rotation.y = lerp(enemy.global_rotation.y,look_target,delta * 3)
enemy.global_rotation.y = rotate_to_face2D(enemy,move_target(),delta,turret_speed)
func attack():
fire(enemy.barrel_1)

View File

@@ -55,10 +55,4 @@ func Physics_Update(delta : float):
var direction = local_destination.normalized()
if enemy.global_position.distance_to(local_destination) > 1:
enemy.velocity = direction * idle_speed
enemy.spider_look_next.look_at(destination)
var look_target = enemy.spider_look_next.global_rotation.y
enemy.global_rotation.y = lerp(enemy.global_rotation.y,look_target,delta * 3)
if enemy.turret_look.is_colliding() and enemy.turret_look.get_collider() is Player:
Transitioned.emit(self,"attack")
enemy.global_rotation.y = rotate_to_face2D(enemy,destination,delta,turret_speed)

View File

@@ -21,8 +21,8 @@ func Exit():
enemy.servo_single.play()
func update_waypoint():
var direction = (player.global_position - enemy.global_position).normalized()
enemy.nav_agent.set_target_position(direction * run_distance)
#var direction = (player.global_position - enemy.global_position).normalized()
enemy.nav_agent.set_target_position(move_target())
func Update(delta):
if heartbeat > 0:
@@ -39,7 +39,7 @@ func Update(delta):
func Physics_Update(delta):
enemy.turret_look_next.look_at(player.global_position)
enemy.turret_look_next.look_at(move_target())
enemy.turret_look.rotation = lerp(enemy.turret_look.rotation,Vector3(deg_to_rad(90),0,0),delta * enemy.turret_look_speed)
var destination = enemy.nav_agent.get_next_path_position()
@@ -47,15 +47,13 @@ func Physics_Update(delta):
var direction = local_destination.normalized()
if enemy.global_position.distance_to(local_destination) > 1:
enemy.velocity = direction * move_speed
enemy.spider_look_next.look_at(player.global_position)
var look_target = enemy.spider_look_next.global_rotation.y
enemy.global_rotation.y = lerp(enemy.global_rotation.y,look_target,delta * body_turn_speed)
enemy.global_rotation.y = rotate_to_face2D(enemy,move_target(),delta,turret_speed)
func finished_reload():
if enemy.turret_look_next.is_colliding():
if enemy.turret_look_next.get_collider() is Player:
Transitioned.emit(self,"attack")
else:
Transitioned.emit(self,"idle")
Transitioned.emit(self,"search")
else:
Transitioned.emit(self,"idle")
Transitioned.emit(self,"search")

View File

@@ -1,61 +1,41 @@
extends EnemyState
class_name EnemySearch
@export var idle_speed : float = 1.5
var search_timer
var move_direction : Vector3
var scan_direction : float
var search_time : float
var scan_time : float
const WANDER_AMT = 50
const TURRET_TURN_AMT : float = 90.0
const TURRET_SCAN_SPEED : float = .5
const SEARCH_TIME_MAX : float = 10.0
func Enter():
super()
search_point()
scan_direction = deg_to_rad(TURRET_TURN_AMT)
search_timer = SEARCH_TIME_MAX
func Update(delta: float):
super(delta)
attack_on_sight()
if search_time > 0:
search_time -= delta
if search_timer > 0:
search_timer -= delta
else:
Transitioned.emit(self,"idle")
if scan_time > 0:
scan_time -= delta
else:
randomize_turret_scan()
attack_on_sight()
search_point()
if enemy.global_position.distance_to(move_target_adj()) < 1:
Transitioned.emit(self,"idle")
func Physics_Update(delta : float):
if enemy:
#turret transform
enemy.turret_look.rotation = lerp(enemy.turret_look.rotation,enemy.turret_look_next.rotation,delta * TURRET_SCAN_SPEED)
var destination = enemy.nav_agent.get_next_path_position()
var local_destination = destination - enemy.global_position
var direction = local_destination.normalized()
if enemy.global_position.distance_to(local_destination) > 1:
enemy.velocity = direction * idle_speed
enemy.spider_look_next.look_at(destination)
var look_target = enemy.spider_look_next.global_rotation.y
enemy.global_rotation.y = lerp(enemy.global_rotation.y,look_target,delta * 3)
if enemy.turret_look.is_colliding() and enemy.turret_look.get_collider() is Player:
Transitioned.emit(self,"attack")
#turret transform
enemy.turret_look_next.look_at(move_target())
enemy.turret_look.rotation = lerp(enemy.turret_look.rotation,enemy.turret_look_next.rotation,delta * turret_speed)
var destination = enemy.nav_agent.get_next_path_position()
var local_destination = destination - enemy.global_position
var direction = local_destination.normalized()
enemy.velocity = direction * move_speed
enemy.global_rotation.y = rotate_to_face2D(enemy,move_target(),delta,turret_speed)
func search_point():
enemy.nav_agent.set_target_position(move_target())
search_time = randf_range(3,10)
func randomize_turret_scan():
scan_direction = -scan_direction
enemy.turret_look_next.rotation = Vector3(0,scan_direction,0)
scan_time = randf_range(5,10)

View File

@@ -3,7 +3,8 @@ class_name EnemyState
@export var enemy : CharacterBody3D
@export var move_speed : float = 3
@export var can_see : bool = false # indicates whether the enemy is able to see things in the state
@export var turret_speed : float = 6.0
@export var can_see : bool = true # indicates whether the enemy is able to see things in the state
@export var time_to_lose_target = 1.0
@onready var target_lost_timer = time_to_lose_target
@@ -14,7 +15,7 @@ func Update(delta):
func move_target():
if enemy.player_last_seen != null:
return enemy.player_last_seen
elif enemy.points_of_interest.size() > 0:
elif enemy.points_of_interest != null:
var move_point = {"loudness" : 0.0,"point" : Vector3.ZERO}
for point in enemy.points_of_interest:
if point["loudness"] > move_point["loudness"]:
@@ -27,7 +28,29 @@ func attack_on_sight():
if can_see:
if enemy.is_player_in_area() and enemy.is_player_visible():
Transitioned.emit(self,"attack")
if enemy.turret_look.is_colliding():
if enemy.turret_look.get_collider() is Player:
Transitioned.emit(self,"attack")
func search_on_lost_target(delta):
if !enemy.is_player_visible():
Transitioned.emit(self,"attack")
func move_target_adj():
var position = move_target()
return Vector3(position.x,enemy.global_position.y,position.z)
func rotate_to_face2D(object,target,delta,turn_speed):
#to allow both nodes and positions to be passed to this function, test the target and use Vector3 coords
var target_transformed
if target == null:
target_transformed = object.global_position
elif target is Vector3:
target_transformed = target
elif target is Node3D:
target_transformed = target.global_position
var pos2d = Vector2(object.global_position.x,object.global_position.z)
var target_pos2d = Vector2(target_transformed.x,target_transformed.z)
var direction = (pos2d - target_pos2d)
return lerp_angle(object.rotation.y,atan2(direction.x,direction.y),delta * turn_speed)

View File

@@ -84,7 +84,7 @@ func _process(delta):
cam_target.global_position = lerp(cam_target.global_position,target_pos_adjusted,delta * MOVE_SPEED)
look_ray.global_position = target_pos_adjusted
look_ray.look_at(Vector3(target.global_position), Vector3.UP)
camera.rotation = lerp_angle(camera.rotation,look_ray.rotation,delta * CAMERA_LOOK_SPEED)
camera.rotation = lerp(camera.rotation,look_ray.rotation,delta * CAMERA_LOOK_SPEED)
camera.fov = lerp(camera.fov, 40.0, delta * 5)
1:
#aim at player from enemy

View File

@@ -17,7 +17,8 @@ func _on_body_exited(body: Node3D) -> void:
if level_control.gamemode.die_on_leaving_bounds == true:
get_tree().current_scene.die()
else:
body.global_position = body.last_ground_pos + Vector3(0,10,0)
body.velocity = Vector3.ZERO
body.global_position = body.last_ground_pos + Vector3(0,.1,0)
func toggle_collision(collision_state):
check_collision = collision_state

View File

@@ -39,7 +39,6 @@ var last_enemy : bool = false
@onready var knocked_timer = $Timers/knocked_timer
@onready var stunned_timer = $Timers/stunned_timer
@onready var turret_look_next = $TurretLookNext
@onready var spider_look_next = $SpiderLookNext
@onready var body = $body
@onready var audio_fire = $AUIDO/Fire
@onready var turret = $TurretLook/Turret
@@ -103,7 +102,6 @@ func _process(delta):
line_of_sight.global_position = global_position
move_and_slide()
look_at_player()
cache_player_pos()
if debug_tools:
debug_marker()