behaviour-tree-test/project/behaviours/animate.gd

36 lines
1.2 KiB
GDScript

extends BehaviourAction
@export var anim_name : String = "jab_1"
@export var allow_interrupt : bool = true
@export var face_target : float = 0.0
@export var wait_for_finish : bool = true
@export var blend : float = 0.01
@onready var body : CharacterBody3D = get_behaviour_tree().get_parent() as CharacterBody3D
@onready var anim : AnimationPlayer = get_behaviour_tree().get_node("%AnimationPlayer") as AnimationPlayer
var target_position : Vector3 = Vector3.ZERO
var anim_started : bool = false
var target_valid : bool = false
func _enter() -> int:
anim_started = false
anim.play(anim_name, blend)
anim.advance(0)
target_valid = body.target != null
if target_valid:
target_position = body.target.global_position
return Running if wait_for_finish else Success
func _execute() -> int:
if wait_for_finish:
if face_target > 0.0 and target_valid:
var max_angle := body.global_basis.z.signed_angle_to(body.global_position - target_position, Vector3.UP)
body.rotate_y(clampf(max_angle, -face_target * get_process_delta_time(), face_target * get_process_delta_time()))
if anim.current_animation == anim_name:
anim_started = true
elif anim_started:
return Success
return Fail if allow_interrupt and body.hurt_high else Running
else:
return Success