using Godot; namespace Cirno.Scripts.Actors._3D; public partial class OpenCloseActorAnimationManager3D : Node { [Export] public AnimationPlayer AnimationPlayer { get; set; } [Export] public StringName OpeningAnimationName { get; set; } = "Opening"; [Export] public StringName ClosingAnimationName { get; set; } = "Closing"; [Export] public StringName OpenAnimationName { get; set; } = "Open"; [Export] public StringName ClosedAnimationName { get; set; } = "Closed"; private bool _isAnimating = false; [Signal] public delegate void ClosedAnimationCompletedEventHandler(); [Signal] public delegate void OpenAnimationCompletedEventHandler(); public override void _Ready() { AnimationPlayer.AnimationFinished += AnimationPlayerOnAnimationFinished; } private void AnimationPlayerOnAnimationFinished(StringName animName) { if (animName == OpenAnimationName || animName == OpeningAnimationName) { EmitSignalOpenAnimationCompleted(); } else if (animName == ClosedAnimationName || animName == ClosingAnimationName) { EmitSignalClosedAnimationCompleted(); } } public void Toggle(bool state) { AnimationPlayer.Play(state ? OpeningAnimationName : ClosingAnimationName); } public void PlayOpening() { AnimationPlayer.Play(OpeningAnimationName); AnimationPlayer.SetSpeedScale(1); } public void PlayClosing() { AnimationPlayer.Play(ClosingAnimationName); AnimationPlayer.SetSpeedScale(1); } public void SkipToOpen() { AnimationPlayer.Play(OpenAnimationName); } public void SkipToClose() { AnimationPlayer.Play(ClosedAnimationName); } }