Files

72 lines
2.2 KiB
C#

using DG.Tweening;
using JetBrains.Annotations;
using UnityEngine;
namespace Dott
{
[AddComponentMenu("DOTween/DOTween Timeline")]
public class DOTweenTimeline : MonoBehaviour
{
[CanBeNull] public Sequence Sequence { get; private set; }
// Do not override the onKill callback because it is used internally to reset the Sequence
public Sequence Play()
{
TryGenerateSequence();
return Sequence.Play();
}
// Wrapper for UnityEvent (requires void return type)
public void DOPlay() => Play();
public Sequence Restart()
{
TryGenerateSequence();
Sequence.Restart();
return Sequence;
}
private void TryGenerateSequence()
{
if (Sequence != null) { return; }
Sequence = DOTween.Sequence();
Sequence.SetLink(gameObject, LinkBehaviour.KillOnDestroy);
Sequence.OnKill(() => Sequence = null);
var components = GetComponents<MonoBehaviour>();
foreach (var component in components)
{
switch (component)
{
case DOTweenAnimation animation:
if (!animation.isValid || !animation.isActive) continue;
animation.CreateTween(regenerateIfExists: true);
Sequence.Insert(0, animation.tween);
break;
case IDOTweenAnimation animation:
if (!animation.IsValid || !animation.IsActive) continue;
var tween = animation.CreateTween(regenerateIfExists: true);
Sequence.Insert(0, tween);
break;
}
}
}
private void OnDestroy()
{
// Already handled by SetLink, but needed to avoid warnings from children DOTweenAnimation.OnDestroy
Sequence?.Kill();
}
public void OnValidate()
{
foreach (var doTweenAnimation in GetComponents<DOTweenAnimation>())
{
doTweenAnimation.autoGenerate = false;
}
}
}
}