godot-steering-ai-framework/godot/addons/com.gdquest.godot-steering-ai-framework/Behaviors/GSAISeparation.gd

40 lines
1.3 KiB
GDScript3
Raw Normal View History

2020-01-29 17:04:04 +01:00
# Calculates an acceleration that repels the agent from its neighbors in the
# given `GSAIProximity`.
2020-01-29 17:04:04 +01:00
#
# The acceleration is an average based on all neighbors, multiplied by a
# strength decreasing by the inverse square law in relation to distance, and it
# accumulates.
2020-04-03 02:31:59 +02:00
# @category - Group behaviors
class_name GSAISeparation
extends GSAIGroupBehavior
# The coefficient to calculate how fast the separation strength decays with distance.
var decay_coefficient : float = 1.0
2023-01-13 20:08:32 +01:00
var acceleration : GSAITargetAcceleration
2023-01-13 20:08:32 +01:00
func _calculate_steering(_acceleration : GSAITargetAcceleration) -> void:
self.acceleration = _acceleration
2023-01-13 20:30:27 +01:00
acceleration.set_zero()
# warning-ignore:return_value_discarded
2023-01-13 20:08:32 +01:00
proximity.find_neighbors(_callback)
# Callback for the proximity to call when finding neighbors. Determines the amount of
# acceleration that `neighbor` imposes based on its distance from the owner agent.
2020-04-03 02:31:59 +02:00
# @tags - virtual
func _report_neighbor(neighbor : GSAISteeringAgent) -> bool:
var to_agent : Vector3 = agent.position - neighbor.position
var distance_squared : float = to_agent.length_squared()
var acceleration_max : float = agent.linear_acceleration_max
var strength := decay_coefficient / distance_squared
if strength > acceleration_max:
strength = acceleration_max
2020-01-29 17:04:04 +01:00
2023-01-13 20:08:32 +01:00
acceleration.linear += to_agent * (strength / sqrt(distance_squared))
return true