61 lines
2 KiB
GDScript
61 lines
2 KiB
GDScript
extends BTPlayer
|
|
|
|
class_name EnemyAI
|
|
|
|
const ROAM_DISTANCE: float = 10.0
|
|
const DISTANCE_TO_PLAYER: float = 10.0
|
|
|
|
@export var character: Enemy
|
|
|
|
@export_category("Sprite")
|
|
@export var visual: GeometryInstance3D;
|
|
@export var idleTexture: Texture2D;
|
|
@export var aggressiveTexture: Texture2D;
|
|
|
|
@export_category("Agents")
|
|
@export var agent: NavigationAgent3D;
|
|
@export var animationTree: AnimationTree;
|
|
|
|
@export_category("Firing")
|
|
@export var MuzzleFlash: PackedScene
|
|
@export var Origin: Node3D
|
|
|
|
var aggressive = false
|
|
|
|
func _physics_process(_delta: float) -> void:
|
|
self.blackboard.set_var('PlayerDistance', character.global_position.distance_to(Player.Instance.global_position))
|
|
self.blackboard.set_var('LookingAngleToPlayer', (-character.global_basis.z).dot((character.global_position - Player.Instance.global_position).normalized()))
|
|
|
|
self.blackboard.set_var('PlayerVisible', getPlayerVisible())
|
|
|
|
func getPlayerVisible() -> bool:
|
|
var query = PhysicsRayQueryParameters3D.create(Origin.global_position, Player.Instance.global_position);
|
|
var result = character.get_world_3d().direct_space_state.intersect_ray(query)
|
|
|
|
if !result:
|
|
return false
|
|
|
|
return result.collider is Player
|
|
|
|
func setAggressive(value: bool) -> void:
|
|
if not aggressive && value:
|
|
agent.target_position = character.global_position;
|
|
|
|
(visual.material_overlay as StandardMaterial3D).albedo_texture = aggressiveTexture if value else idleTexture
|
|
aggressive = value
|
|
|
|
|
|
func roam() -> void:
|
|
var targetPosition = character.global_position + (Vector3(randf_range(-1, 1), randf_range(-1, 1), randf_range(-1,1)).normalized() * randf_range(0, ROAM_DISTANCE))
|
|
agent.target_position = targetPosition
|
|
|
|
func moveToPlayer() -> void:
|
|
var toPlayerDirection = Player.Instance.global_position - character.global_position
|
|
agent.target_position = Player.Instance.global_position + toPlayerDirection.normalized() * -DISTANCE_TO_PLAYER
|
|
|
|
func Fire() -> void:
|
|
self.animationTree['parameters/playback'].travel('Fire')
|
|
var instance = MuzzleFlash.instantiate()
|
|
Origin.add_child(instance)
|
|
character.fireWeapon()
|
|
|