using DG.Tweening; using UnityEngine; using UnityEngine.Playables; namespace FT.Timeline { public class DOTweenBehaviour : PlayableBehaviour { public DOTweenClipType tweenType; public int variantId; public float tweenDuration; public Vector2 shakeStrength; public int shakeVibrato; public float shakeRandomness; public bool shakeSnapping; public bool shakeFadeOut; public ShakeRandomnessMode shakeRandomnessMode; private Tween _activeTween; private RectTransform _target; public override void OnBehaviourPlay(Playable playable, FrameData info) { } public override void OnBehaviourPause(Playable playable, FrameData info) { KillTween(); } public override void OnPlayableDestroy(Playable playable) { KillTween(); } public override void ProcessFrame(Playable playable, FrameData info, object playerData) { var target = playerData as RectTransform; if (target == null) { return; } if (!IsVariantMatched(target)) { KillTween(); return; } if (_activeTween == null || _target != target) { KillTween(); _target = target; _activeTween = CreateTween(target); } if (_activeTween == null || !_activeTween.IsActive()) { return; } var duration = Mathf.Max(tweenDuration, 0f); var localTime = duration > 0f ? Mathf.Clamp((float)playable.GetTime(), 0f, duration) : 0f; _activeTween.Goto(localTime, false); } private bool IsVariantMatched(RectTransform target) { var selector = target.GetComponent(); if (selector == null) { return true; } return selector.CurrentVariantId == variantId; } private Tween CreateTween(RectTransform target) { Tween tween; switch (tweenType) { case DOTweenClipType.ShakeAnchorPos: tween = target.DOShakeAnchorPos(tweenDuration, shakeStrength, shakeVibrato, shakeRandomness, shakeSnapping, shakeFadeOut, shakeRandomnessMode); break; default: return null; } return tween.SetAutoKill(false).Pause(); } private void KillTween() { if (_activeTween == null) { return; } if (_activeTween.IsActive()) { _activeTween.Kill(); } _activeTween = null; _target = null; } } }