--- /dev/null
+extends CharacterBody3D
+
+@export var SPEED := 2.5
+@export var turn_speed := 2.0
+@export_range(0, 9) var noise_threshold := 5
+@export var player: Node3D
+
+@onready var navigation_agent := $NavigationAgent3D
+@onready var pivot := $Pivot
+
+
+func _physics_process(delta):
+ var distance_to_player := global_position.distance_to(player.global_position)
+
+ if player.get_meta("noise") > noise_threshold:
+ # move to player
+ navigation_agent.set_target_position(player.global_transform.origin)
+ var velocity: Vector3 = (
+ (navigation_agent.get_next_path_position() - transform.origin).normalized()
+ * SPEED
+ * delta
+ )
+ move_and_collide(velocity)
+
+ # look at player
+ pivot.look_at(player.global_transform.origin, Vector3.UP)
+ rotate_y(deg_to_rad(pivot.rotation.y * turn_speed))
--- /dev/null
+[gd_scene load_steps=4 format=3 uid="uid://6v0x74t1fjxk"]
+
+[ext_resource type="Script" path="res://enemies/base_enemy.gd" id="1_kxqsq"]
+
+[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_aahun"]
+
+[sub_resource type="CapsuleMesh" id="CapsuleMesh_uypfm"]
+
+[node name="BaseEnemy" type="CharacterBody3D"]
+script = ExtResource("1_kxqsq")
+
+[node name="Pivot" type="Node3D" parent="."]
+
+[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
+transform = Transform3D(1.91069e-15, 4.37114e-08, 1, 1, -4.37114e-08, 0, 4.37114e-08, 1, -4.37114e-08, 0, 1, 0)
+shape = SubResource("CapsuleShape3D_aahun")
+
+[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
+transform = Transform3D(1.91069e-15, 4.37114e-08, 1, 1, -4.37114e-08, 0, 4.37114e-08, 1, -4.37114e-08, 0, 1, 0)
+mesh = SubResource("CapsuleMesh_uypfm")
+
+[node name="NavigationAgent3D" type="NavigationAgent3D" parent="."]