pretty happy with basic AI behavior
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user