godot-steering-ai-framework/project/src/proximities/GSTRadiusProximity.gd

52 lines
1.4 KiB
GDScript3
Raw Normal View History

extends GSTProximity
class_name GSTRadiusProximity
# Specifies any agent that is in the specified list as being neighbors with the owner agent if they
# lie within the specified radius.
var radius: = 0.0
var _last_frame: = 0
var _scene_tree: SceneTree
func _init(agent: GSTSteeringAgent, agents: Array, radius: float).(agent, agents) -> void:
self.radius = radius
_scene_tree = Engine.get_main_loop()
func find_neighbors(callback: FuncRef) -> int:
var agent_count: = agents.size()
var neighbor_count: = 0
var current_frame: = _scene_tree.get_frame() if _scene_tree else -_last_frame
if current_frame != _last_frame:
_last_frame = current_frame
var owner_position: = agent.position
for i in range(agent_count):
var current_agent: = agents[i] as GSTSteeringAgent
if current_agent != agent:
var distance_squared: = owner_position.distance_squared_to(current_agent.position)
var range_to: = radius + current_agent.bounding_radius
if distance_squared < range_to * range_to:
if callback.call_func(current_agent) == true:
current_agent.tagged = true
neighbor_count += 1
continue
current_agent.tagged = false
else:
for i in range(agent_count):
var current_agent = agents[i] as GSTSteeringAgent
if current_agent != agent and current_agent.tagged:
if callback.call_func(current_agent) == true:
neighbor_count += 1
return neighbor_count