mirror of
https://github.com/Relintai/broken_seals.git
synced 2024-12-25 01:17:10 +01:00
61 lines
1.6 KiB
GDScript
61 lines
1.6 KiB
GDScript
# A specialized steering agent that updates itself every frame so the user does
|
|
# not have to using a RigidBody
|
|
extends GSAISpecializedAgent
|
|
class_name GSAIRigidBody3DAgent
|
|
|
|
# The RigidBody to keep track of
|
|
var body: RigidBody setget _set_body
|
|
|
|
var _last_position: Vector3
|
|
|
|
|
|
func _init(_body: RigidBody) -> void:
|
|
if not _body.is_inside_tree():
|
|
yield(_body, "ready")
|
|
|
|
self.body = _body
|
|
# warning-ignore:return_value_discarded
|
|
self.body.get_tree().connect("physics_frame", self, "_on_SceneTree_frame")
|
|
|
|
|
|
# Moves the agent's `body` by target `acceleration`.
|
|
# tags: virtual
|
|
func _apply_steering(acceleration: GSAITargetAcceleration, _delta: float) -> void:
|
|
_applied_steering = true
|
|
body.apply_central_impulse(acceleration.linear)
|
|
body.apply_torque_impulse(Vector3.UP * acceleration.angular)
|
|
if calculate_velocities:
|
|
linear_velocity = body.linear_velocity
|
|
angular_velocity = body.angular_velocity.y
|
|
|
|
|
|
func _set_body(value: RigidBody) -> void:
|
|
body = value
|
|
|
|
_last_position = body.transform.origin
|
|
_last_orientation = body.rotation.y
|
|
|
|
position = _last_position
|
|
orientation = _last_orientation
|
|
|
|
|
|
func _on_body_ready() -> void:
|
|
# warning-ignore:return_value_discarded
|
|
body.get_tree().connect("physics_frame", self, "_on_SceneTree_frame")
|
|
_set_body(body)
|
|
|
|
|
|
func _on_SceneTree_frame() -> void:
|
|
var current_position := body.transform.origin
|
|
var current_orientation := body.rotation.y
|
|
|
|
position = current_position
|
|
orientation = current_orientation
|
|
|
|
if calculate_velocities:
|
|
if _applied_steering:
|
|
_applied_steering = false
|
|
else:
|
|
linear_velocity = body.linear_velocity
|
|
angular_velocity = body.angular_velocity.y
|