63 lines
1.8 KiB
GDScript3
63 lines
1.8 KiB
GDScript3
|
@tool
|
||
|
@icon("animation_player_state.svg")
|
||
|
class_name AnimationPlayerState
|
||
|
extends AtomicState
|
||
|
|
||
|
## Animation player that this state will use.
|
||
|
@export_node_path("AnimationPlayer") var animation_player: NodePath:
|
||
|
set(value):
|
||
|
animation_player = value
|
||
|
update_configuration_warnings()
|
||
|
|
||
|
## The name of the animation that should be played when this state is entered.
|
||
|
## When this is empty, the name of this state will be used.
|
||
|
@export var animation_name: StringName = ""
|
||
|
|
||
|
## A custom blend time for the animation. The default value of -1.0 will use the
|
||
|
## default blend time of the animation player.
|
||
|
@export var custom_blend: float = -1.0
|
||
|
|
||
|
## A custom speed for the animation. Use negative values to play the animation
|
||
|
## backwards.
|
||
|
@export var custom_speed: float = 1.0
|
||
|
|
||
|
## Whether the animation should be played from the end.
|
||
|
@export var from_end: bool = false
|
||
|
|
||
|
var _animation_player: AnimationPlayer
|
||
|
|
||
|
func _ready():
|
||
|
if Engine.is_editor_hint():
|
||
|
return
|
||
|
|
||
|
super._ready()
|
||
|
_animation_player = get_node_or_null(animation_player)
|
||
|
|
||
|
if not is_instance_valid(_animation_player):
|
||
|
push_error("The animation player is invalid. This node will not work.")
|
||
|
|
||
|
func _state_enter(expect_transition: bool = false):
|
||
|
super._state_enter()
|
||
|
|
||
|
if not is_instance_valid(_animation_player):
|
||
|
return
|
||
|
|
||
|
var target_animation = animation_name
|
||
|
if target_animation == "":
|
||
|
target_animation = get_name()
|
||
|
|
||
|
if _animation_player.current_animation == target_animation and _animation_player.is_playing():
|
||
|
return
|
||
|
|
||
|
_animation_player.play(target_animation, custom_blend, custom_speed, from_end)
|
||
|
|
||
|
func _get_configuration_warnings():
|
||
|
var warnings = super._get_configuration_warnings()
|
||
|
|
||
|
if animation_player.is_empty():
|
||
|
warnings.append("No animation player is set.")
|
||
|
elif get_node_or_null(animation_player) == null:
|
||
|
warnings.append("The animation player path is invalid.")
|
||
|
|
||
|
return warnings
|