diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/bsp_level_generator.gd | 11 | ||||
-rw-r--r-- | scripts/enemy.gd | 48 |
2 files changed, 54 insertions, 5 deletions
diff --git a/scripts/bsp_level_generator.gd b/scripts/bsp_level_generator.gd index 5d70569..87806e2 100644 --- a/scripts/bsp_level_generator.gd +++ b/scripts/bsp_level_generator.gd @@ -123,7 +123,16 @@ func generate_geo(grid: Array[Tile]): csg_root.add_child(box) csg_root.use_collision = true - add_child(csg_root) + $NavigationRegion3D.add_child(csg_root) + + # We need to delay baking the nav mesh as + # the CSG won't be generated immediately + call_deferred("bake_nav") + +func bake_nav(): + print("Baking mesh") + $NavigationRegion3D.bake_navigation_mesh(false) + print("done baking") func _ready() -> void: var starting_axis = randi_range(0, 1) diff --git a/scripts/enemy.gd b/scripts/enemy.gd index 569905f..6be60c7 100644 --- a/scripts/enemy.gd +++ b/scripts/enemy.gd @@ -6,7 +6,12 @@ extends CharacterBody3D @export var target: Node3D ## Whether to use gravity on enemy -@export var gravity_enabled: bool = false +@export var gravity_enabled: bool = true + +## Use nav mesh or dumb path finding +@export var use_nav_mesh: bool = true + +@onready var nav_agent: NavigationAgent3D = $NavigationAgent3D var has_astar: bool = false var astar: AStar3D @@ -15,9 +20,17 @@ var gravity : float = ProjectSettings.get_setting("physics/3d/default_gravity") var original_color: Color +var mesh_ready = false + func _ready() -> void: if gravity_enabled: motion_mode = MotionMode.MOTION_MODE_GROUNDED + + NavigationServer3D.connect("map_changed", map_changed) + +func map_changed(_rid): + print("Map changed") + mesh_ready = true func chase_target(delta: float) -> void: var target_pos = target.position @@ -34,19 +47,46 @@ func chase_target(delta: float) -> void: velocity.y -= gravity * delta move_and_slide() + +func update_target_location(target_location: Vector3): + nav_agent.target_position = target_location + +func chase_nav_mesh(delta: float): + if not mesh_ready: + return + + if target != null: + update_target_location(target.global_position) + + var current_location = global_transform.origin + var next_location = nav_agent.get_next_path_position() + var new_velocity = (next_location - current_location).normalized() * speed + + # We only want to navigate on XZ plane + new_velocity.y = 0 + + velocity = new_velocity + + if not is_on_floor() and gravity_enabled: + velocity.y -= gravity * delta + move_and_slide() func _physics_process(delta: float) -> void: if target == null: return + if Input.is_action_pressed("ui_right"): + return + + if use_nav_mesh: + chase_nav_mesh(delta) + return + if not has_astar: # Just try to chase player directly chase_target(delta) return - if Input.is_action_pressed("ui_right"): - return - var target_pos = target.position var closest_me = astar.get_closest_point(position) var closest_target = astar.get_closest_point(target_pos) |