using DG.Tweening;
using System;
using UnityEngine;
using XGame.Framework.Interfaces;
using XGame.Framework.Time;
namespace FL.Battle.Actions
{
///
/// MoveLineAction的参数
///
public struct MoveActionArgs
{
public Vector3 from;
public Vector3 to;
///
/// 单位:毫秒
///
public int duration;
///
/// 延迟,单位: 毫秒
///
public int delay;
public Ease ease;
public Action onUpdate;
public Action onComplete;
}
///
/// 直线移动
/// Dotween.DOMove
///
public class MoveLineAction : IAction, IPauseable, ITimeScalable
{
public MoveActionArgs args;
private Tween _tween;
private bool _paused;
float ITimeScalable.TimeScale
{
get => _tween?.timeScale ?? 1;
set
{
if (_tween == null)
{
return;
}
_tween.timeScale = value;
}
}
void IReference.Clear()
{
args = default;
_tween?.Kill();
_tween = null;
_paused = false;
}
public void Start(Transform transform)
{
transform.position = args.from;
_tween = transform.DOMove(args.to, args.duration * 0.001f);
if (args.delay > 0)
{
_tween.SetDelay(args.delay * 0.001f);
}
_tween.SetEase(args.ease == Ease.Unset ? Ease.Linear : args.ease);
if (args.onUpdate != null)
{
_tween.onUpdate += () =>
{
args.onUpdate.SafeInvoke(transform.position);
};
}
_tween.onComplete += () =>
{
var callback = args.onComplete;
_tween = null;
args = default;
callback.SafeInvoke();
};
}
void IPauseable.Pause()
{
if (_tween == null || _paused)
{
return;
}
_paused = true;
_tween.Pause();
}
void IPauseable.Resume()
{
if (_paused)
{
_paused = false;
_tween?.Play();
}
}
}
}