66 lines
1.5 KiB
C#
66 lines
1.5 KiB
C#
![]() |
using Godot;
|
||
|
|
||
|
|
||
|
namespace Rokojori
|
||
|
{
|
||
|
[Tool][GlobalClass ]
|
||
|
public partial class MoveTo : SequenceAction, Animator
|
||
|
{
|
||
|
[Export]
|
||
|
public Node3D target;
|
||
|
|
||
|
[Export]
|
||
|
public Node3D goal;
|
||
|
|
||
|
[Export]
|
||
|
public Duration duration;
|
||
|
|
||
|
int _actionID = -1;
|
||
|
int _currentSpanAnimationID = -1;
|
||
|
|
||
|
public void OnAnimatorStart(){}
|
||
|
public void OnAnimatorEnd(){}
|
||
|
public void OnAnimatorCancel(){}
|
||
|
|
||
|
protected override void _OnTrigger()
|
||
|
{
|
||
|
if ( _actionID != -1 )
|
||
|
{
|
||
|
CancelAction( _actionID );
|
||
|
}
|
||
|
|
||
|
var sequenceID = DispatchStart();
|
||
|
_actionID = sequenceID;
|
||
|
|
||
|
AnimationManager.StartAnimation( this, target, AnimationMember.Position );
|
||
|
|
||
|
var startPosition = target.GlobalPosition;
|
||
|
|
||
|
_currentSpanAnimationID = TimeLineManager.ScheduleSpanIn( duration.timeLine, 0, duration.GetDurationInSeconds(),
|
||
|
( TimeLineSpan span, TimeLineSpanUpdateType type )=>
|
||
|
{
|
||
|
if ( span.id != _currentSpanAnimationID )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( ! AnimationManager.IsAnimating( this, target, AnimationMember.Position ) )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
target.GlobalPosition = startPosition.Lerp( goal.GlobalPosition, span.phase );;
|
||
|
|
||
|
|
||
|
if ( TimeLineSpanUpdateType.End == type )
|
||
|
{
|
||
|
AnimationManager.EndAnimation( this, target, AnimationMember.Position );
|
||
|
|
||
|
DispatchEnd( sequenceID );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
).id;
|
||
|
}
|
||
|
}
|
||
|
}
|