34 lines
1.2 KiB
GDScript
34 lines
1.2 KiB
GDScript
extends Node3D
|
|
class_name NavObstable
|
|
|
|
@export var enabled: bool = false:
|
|
set(val):
|
|
if val != enabled:
|
|
enabled = val
|
|
update(enabled)
|
|
@export var aabb: AABB = AABB(Vector3(-1,0,-1),Vector3(2,2,2))
|
|
@export var weight: float = 10.0
|
|
@export var make_solid: bool = false
|
|
|
|
var updated_regions: Array[RID] = []
|
|
|
|
func _exit_tree() -> void:
|
|
update(false)
|
|
|
|
func update(enable: bool) -> void:
|
|
if !is_node_ready():
|
|
await ready
|
|
var global_aabb: AABB = global_transform * aabb
|
|
#DebugDraw3D.draw_aabb(global_aabb, Color.DARK_CYAN, 5)
|
|
for map_rid in NavigationServer3D.get_maps():
|
|
for region_rid in NavigationServer3D.map_get_regions(map_rid):
|
|
var region_aabb: AABB = NavigationServer3D.region_get_bounds(region_rid).grow(0.1)
|
|
#DebugDraw3D.draw_aabb(region_aabb, Color.YELLOW, 5)
|
|
if global_aabb.intersects(region_aabb):
|
|
var old_weight: float = NavigationServer3D.region_get_travel_cost(region_rid)
|
|
var new_weight: float = (old_weight * weight) if enable else (old_weight / weight)
|
|
NavigationServer3D.region_set_travel_cost(region_rid, new_weight)
|
|
if make_solid:
|
|
NavigationServer3D.region_set_enabled(region_rid, enable)
|
|
DebugDraw3D.draw_aabb(region_aabb, Color.RED if enable else Color.GREEN, 5)
|