TweenerSystem

Namespace: Vortex.Unity.UI.TweenerSystem Сборка: ru.vortex.unity.ui.misc

Назначение

Система анимаций на базе UniTask. Два режима: сценарный (TweenerHub + TweenLogic) и standalone (AsyncTween fluent API).

Возможности:

  • Сценарные анимации: Forward / Back / Pulse с поддержкой offset и switch-точек
  • 5 готовых TweenLogic: цвет, прозрачность CanvasGroup, масштаб, fillAmount, pivot
  • Standalone fluent API для одноразовых анимаций из кода
  • 16 типов easing + поддержка AnimationCurve
  • Шорткаты для типовых операций (Move, Scale, Fade, Color, Slider)

Вне ответственности:

  • Skeletal/sprite-анимации (Animator, DOTween)
  • Анимации физики

Зависимости

Зависимость Назначение
UniTask Асинхронные анимации (CancellationToken, UniTask.Yield)
Vortex.Core.SettingsSystem Settings.Data() — debug-флаги
Vortex.Unity.AppSystem TimeController.Accumulate() — аккумуляция вызовов
Vortex.Unity.EditorTools [ClassLabel]
Odin Inspector [ShowInInspector], [MinValue], [MaxValue]
TextMeshPro Поддержка в ColorLogic

Архитектура

TweenerSystem/
├── TweenerHub.cs               # Сценарный контроллер (MonoBehaviour)
├── TweenLogic.cs               # Абстрактная база анимации
├── TweenPreset.cs              # ScriptableObject: curve, duration, switch-флаги
├── TweenLogics/
│   ├── ColorLogic.cs           # Цвет: Image, Text, TMP, SpriteRenderer
│   ├── CanvasOpacityLogic.cs   # Прозрачность CanvasGroup + blocksRaycasts
│   ├── RectScaleLogic.cs       # Масштаб RectTransform (Both/X/Y)
│   ├── FillImageLogic.cs       # fillAmount Image
│   └── PivotLogic.cs           # pivot RectTransform
├── UniTaskTweener/
│   ├── AsyncTween.cs           # Standalone fluent API
│   ├── AsyncTweenExtensions.cs # Шорткаты (Move, Scale, Fade...)
│   └── Easing.cs               # 16 типов easing
└── Debug/
    ├── Model/SettingsModelExtAsyncTweener.cs
    └── Presets/DebugSettingsExtAsyncTweener.cs

Сценарный режим

TweenerHub (MonoBehaviour)

Управляет массивом TweenLogic. Привязывается к GameObject на сцене.

tweenerHub.Forward();       // воспроизведение вперёд
tweenerHub.Back();          // воспроизведение назад
tweenerHub.Pulse();         // переключение направления
tweenerHub.Forward(true);   // мгновенный переход (skip)

Жизненный цикл:

  • Awake — инициализация всех TweenLogic (Init())
  • OnEnable — возобновление отложенных анимаций
  • OnDisable — снятие из очереди TimeController
  • OnDestroyDeInit() всех TweenLogic

TweenLogic (abstract, Serializable)

Базовый класс анимации. Наследники реализуют SetValue(float value) для интерполяции 0→1.

Поле Тип Описание
preset TweenPreset Кривая, длительность, switch-флаги
offset float Задержка Forward (секунды)
offsetBack float Задержка Back (секунды)

Абстрактные методы:

Метод Описание
SetValue(float) Применение интерполированного значения
SwitchOn() Активация визуального элемента
SwitchOff() Деактивация визуального элемента
OnStart() Callback начала анимации
OnEnd() Callback завершения анимации

Состояние: _isForward, _progress (0..1), _cts (CancellationTokenSource). Поддерживает смену направления во время воспроизведения с пересчётом elapsed time.

TweenPreset (ScriptableObject)

Поле Тип Описание
curve AnimationCurve Кривая easing
duration float Длительность (0..5 сек)
offOnStartPoint bool Деактивировать элемент в точке 0
offOnEndPoint bool Деактивировать элемент в точке 1

Реализации TweenLogic

Класс Цель Что анимирует
ColorLogic Image[], Text[], TMP[], SpriteRenderer[] Цвет (Lerp start→end)
CanvasOpacityLogic CanvasGroup[] alpha; blocksRaycasts управляется асимметрично (start ≠ end)
RectScaleLogic RectTransform[] localScale (режим Both / X only / Y only)
FillImageLogic Image[] fillAmount
PivotLogic RectTransform pivot (Vector2 Lerp startPos→endPos)

Standalone режим (AsyncTween)

Namespace: Vortex.Unity.UI.TweenerSystem.UniTaskTweener

Fluent API для одноразовых анимаций без привязки к сцене:

new AsyncTween()
    .Set(() => transform.localScale, v => transform.localScale = v, Vector3.one, 0.3f)
    .SetEase(EaseType.OutBack)
    .OnComplete(() => Debug.Log("Done"))
    .OnUpdate(progress => { })
    .Run();
Метод Описание
Set(getter, setter, target, duration) Конфигурация (float, Vector2, Vector3, Color)
SetEase(EaseType) / SetEase(AnimationCurve) Кривая анимации
OnComplete(Action) Callback завершения (не вызывается при Kill)
OnKill(Action) Callback при прерывании через Kill (не вызывается при нормальном завершении)
OnUpdate(Action<float>) Callback каждого кадра (progress 0..1)
SetToken(CancellationToken) Внешний токен отмены
Run() Запуск (возвращает self для цепочки). Параметры сбрасываются после запуска
Kill() Отмена анимации, вызывает OnKill

Свойства: Progress (float 0..1), IsPlaying (bool).

Шорткаты (AsyncTweenExtensions)

new AsyncTween().SetLocalMove(transform, targetPos, 0.5f).Run();
new AsyncTween().SetMove(transform, worldPos, 0.5f).Run();
new AsyncTween().SetScale(transform, Vector3.zero, 0.2f).SetEase(EaseType.InBack).Run();
new AsyncTween().SetFade(canvasGroup, 0f, 0.3f).Run();
new AsyncTween().SetColor(graphic, Color.red, 0.4f).Run();
new AsyncTween().SetSlider(slider, 0.75f, 0.5f).Run();
new AsyncTween().SetSize(rectTransform, newSize, 0.3f).Run();
new AsyncTween().SetAnchoredMove(rectTransform, anchoredPos, 0.4f).Run();
new AsyncTween().SetPivot(rectTransform, newPivot, 0.3f).Run();

Easing

16 типов: Linear, InQuad, OutQuad, InOutQuad, InCubic, OutCubic, InOutCubic, InBack, OutBack, InOutBack, InElastic, OutElastic, InOutElastic, InBounce, OutBounce, InOutBounce.


Debug

Settings.Data().AsyncTweenerDebugMode — включается в ассете DebugSettings (toggle asyncTweenerLogs).


Граничные случаи

Ситуация Поведение
Смена направления во время анимации Корректный пересчёт elapsed time
AsyncTween с duration ≤ 0 Мгновенное применение + OnComplete
TweenerHub на OnDisable Снимается из очереди TimeController
Forward(skip: true) Мгновенный переход без анимации
Pulse() во время анимации Очередь Pulse после текущего tween
CanvasOpacityLogic Forward→Back blocksRaycasts управляется асимметрично
Kill() на AsyncTween Отмена через CancellationTokenSource, OnComplete не вызывается, OnKill вызывается
Run() после Set() Параметры fluent-цепочки сбрасываются (ResetParams), но OnKill сохраняется до завершения или следующего Kill
Повторный Run() без Set() Мгновенное применение (duration = 0), OnComplete вызывается