rj-action-library/Runtime/Actions/Visual/TweenFloat.cs

100 lines
2.1 KiB
C#
Raw Normal View History

2025-07-25 08:13:35 +00:00
using System;
using Godot;
namespace Rokojori
{
[Tool]
[GlobalClass ]
public partial class TweenFloat:SequenceAction, Animator
{
[Export]
public GodotObject target;
[Export]
public string targetMember;
[Export]
public float endValue;
[Export]
public Duration duration;
[Export]
public Curve curve;
public void OnAnimatorStart(){}
public void OnAnimatorEnd(){}
public void OnAnimatorCancel(){}
int _actionID = -1;
int _timeID = -1;
protected override void _OnTrigger()
{
this.LogInfo( "Started Float Tween" );
if ( Engine.IsEditorHint() )
{
return;
}
if ( _actionID != -1 )
{
CancelAction( _actionID );
}
_actionID = DispatchStart();
var startValue = ReflectionHelper.GetValue<float>( target, targetMember );
AnimationManager.StartAnimation( this, target, targetMember );
// this.LogInfo( "Get Float Tween", startValue );
_timeID = TimeLineManager.ScheduleSpanWith( duration,
( span, type )=>
{
// this.LogInfo( "Update Float Tween", startValue );
if ( span.id != _timeID )
{
return;
}
if ( ! AnimationManager.IsAnimating( this, target, targetMember ) )
{
return;
}
var phase = span.phase;
if ( curve != null )
{
phase = curve.Sample( phase );
}
var value = Mathf.Lerp( startValue, endValue, phase );
// this.LogInfo( "Updating Float Tween", "phase:", phase, "value:", value, target );
ReflectionHelper.SetValue( target, targetMember, value );
if ( type == TimeLineSpanUpdateType.End )
{
// this.LogInfo( "End Float Tween", endValue );
target._Set( targetMember, endValue );
AnimationManager.EndAnimation( this, target, targetMember );
DispatchEnd( _actionID );
_actionID = -1;
_timeID = -1;
}
}
).id;
}
}
}