Door Animation Module

This commit is contained in:
Marco 2025-07-09 09:20:48 +02:00
commit af44d96c33
24 changed files with 438 additions and 50 deletions

View file

@ -9,25 +9,35 @@ public partial class Door3D : AnimatableBody3D, IActivable
{
[Export] public string GroupName { get; set; }
[Export] public DoorState State { get; set; } = DoorState.Closed;
[Signal] public delegate void OpeningEventHandler();
[Signal] public delegate void ClosingEventHandler();
[Export] public AnimationPlayer AnimationPlayer { get; set; }
[Export] public string OpenAnimationName { get; set; } = "Open";
[Export] public string CloseAnimationName { get; set; } = "Close";
[Export] public string OpenedAnimationName { get; set; } = "Opened";
[Export] public string ClosedAnimationName { get; set; } = "Closed";
[Signal]
public delegate void OpeningEventHandler();
[Signal]
public delegate void ClosingEventHandler();
[Signal]
public delegate void SetClosedEventHandler();
[Signal]
public delegate void SetOpenEventHandler();
// [Export] public AnimationPlayer AnimationPlayer { get; set; }
//
// [Export] public string OpenAnimationName { get; set; } = "Open";
//
// [Export] public string CloseAnimationName { get; set; } = "Close";
//
// [Export] public string OpenedAnimationName { get; set; } = "Opened";
//
// [Export] public string ClosedAnimationName { get; set; } = "Closed";
private bool _isAnimating = false;
private bool _isPlayerIncollider = false;
private CollisionShape3D _collisionShape;
public override void _Ready()
{
if (Engine.IsEditorHint()) return;
@ -36,42 +46,39 @@ public partial class Door3D : AnimatableBody3D, IActivable
{
this.AddToGroup(GroupName);
}
_collisionShape = GetNode<CollisionShape3D>("CollisionShape3D");
SyncAnimation();
AnimationPlayer.AnimationFinished += AnimationPlayerOnAnimationFinished;
// AnimationPlayer.AnimationFinished += AnimationPlayerOnAnimationFinished;
}
private void SyncAnimation()
{
if (State is DoorState.Closed)
{
AnimationPlayer.Play(ClosedAnimationName);
EmitSignalSetClosed();
//AnimationPlayer.Play(ClosedAnimationName);
}
else
{
AnimationPlayer.Play(OpenedAnimationName);
EmitSignalSetOpen();
//AnimationPlayer.Play(OpenedAnimationName);
}
}
private void AnimationPlayerOnAnimationFinished(StringName animName)
public void ClosedAnimationFinished()
{
if (Engine.IsEditorHint()) return;
GD.Print($"Animation finished {animName}");
if ((animName == OpenAnimationName || animName == OpenedAnimationName))
{
State = DoorState.Open;
CallDeferred(MethodName.ToggleCollisionDeferred, false);
}
else if (animName == CloseAnimationName || animName == ClosedAnimationName)
{
State = DoorState.Closed;
CallDeferred(MethodName.ToggleCollisionDeferred, true);
}
State = DoorState.Closed;
CallDeferred(MethodName.ToggleCollisionDeferred, true);
_isAnimating = false;
}
public void OpenAnimationFinished()
{
State = DoorState.Open;
CallDeferred(MethodName.ToggleCollisionDeferred, false);
_isAnimating = false;
}
@ -91,6 +98,7 @@ public partial class Door3D : AnimatableBody3D, IActivable
{
return false;
}
Toggle();
break;
case ActivationType.Enable:
@ -99,6 +107,7 @@ public partial class Door3D : AnimatableBody3D, IActivable
{
return false;
}
ChangeState(DoorState.Closed);
break;
case ActivationType.Disable:
@ -123,19 +132,15 @@ public partial class Door3D : AnimatableBody3D, IActivable
switch (newState)
{
case DoorState.Open:
AnimationPlayer.Play(OpenAnimationName);
AnimationPlayer.SetSpeedScale(1);
//CallDeferred(MethodName.ToggleCollisionDeferred, false);
EmitSignalOpening();
break;
case DoorState.Closed:
AnimationPlayer.Play(CloseAnimationName);
AnimationPlayer.SetSpeedScale(1);
//CallDeferred(MethodName.ToggleCollisionDeferred, true);
EmitSignalClosing();
break;
}
//State = newState;
_isAnimating = true;
}
@ -147,7 +152,7 @@ public partial class Door3D : AnimatableBody3D, IActivable
public void Toggle()
{
if (_isAnimating) return;
ChangeState(State is DoorState.Open ? DoorState.Closed : DoorState.Open);
ChangeState(State is DoorState.Open ? DoorState.Closed : DoorState.Open);
}
public void OnPlayerDetected(Node3D body)

View file

@ -0,0 +1,62 @@
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 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);
}
}

View file

@ -0,0 +1 @@
uid://c077xadpua5iy