namespace SpiralCircus.DOTween { using System; using DG.Tweening; using SpiralCircus.Mathematics; using SpiralCircus.Unity; using UnityEngine; // ReSharper disable InconsistentNaming public static class DOTweenTMPExtension { // Static init [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterAssembliesLoaded)] private static void IncreaseTweenCapacity() => DOTween.SetTweensCapacity(500, 50); // Text Crawler public static Tween DOCrawl(this DOTweenTMPAnimator animator, float letterInterval, float fadeDuration, float scaleDuration, bool reverseOrder = false) { var sequence = DOTween.Sequence(); sequence.AppendInterval(0.1f); var startIndex = reverseOrder ? animator.textInfo.characterCount - 1 : 0; Func condition = reverseOrder ? i => i >= 0 : i => i < animator.textInfo.characterCount; var increment = reverseOrder ? -1 : 1; for (var i = 0; i < animator.textInfo.characterCount; i++) { if (!animator.textInfo.characterInfo[i].isVisible) continue; sequence.Insert(0, animator.DOFadeChar(i, 0, Time.deltaTime)); sequence.Insert(0, animator.DOScaleChar(i, .5f, Time.deltaTime)); } var j = 1; for (var i = startIndex; condition(i); i += increment) { if (!animator.textInfo.characterInfo[i].isVisible) continue; sequence.Insert(j * letterInterval, animator.DOFadeChar(i, 1, fadeDuration)); sequence.Insert(j * letterInterval, animator.DOScaleChar(i, 1, scaleDuration)); j++; } return sequence; } // Roll Scale public static Tween DORollScale(this DOTweenTMPAnimator animator, float duration, float interval, float minSize, float maxSize) { var sequence = DOTween.Sequence(); var j = 0; for (var i = 0; i < animator.textInfo.characterCount; i++) { if (!animator.textInfo.characterInfo[i].isVisible) continue; sequence .Insert(j * interval, animator.DOScaleChar(i, minSize, duration)) .Insert(j * interval + duration, animator.DOScaleChar(i, maxSize, duration)); j++; } return sequence; } // SHORTCUTS public static Tween DOResetScale(this DOTweenTMPAnimator animator, float duration) { var sequence = DOTween.Sequence(); for (var i = 0; i < animator.textInfo.characterCount; i++) { if (!animator.textInfo.characterInfo[i].isVisible) continue; sequence.Insert(0, animator.DOScaleChar(i, 1, duration)); } return sequence; } public static DOTweenTMPAnimator SetAllCharsAlpha(this DOTweenTMPAnimator animator, float alpha) { for (var i = 0; i < animator.textInfo.characterCount; i++) { if (!animator.textInfo.characterInfo[i].isVisible) continue; var color = animator.GetCharColor(i); color.a = alpha; animator.SetCharColor(i, color); } return animator; } public static DOTweenTMPAnimator SetCharAlpha(this DOTweenTMPAnimator animator, int index, float alpha) { var color = animator.GetCharColor(index); color.a = alpha; animator.SetCharColor(index, color); return animator; } public static DOTweenTMPAnimator SetAllCharOffsets(this DOTweenTMPAnimator animator, Vector2 offset) { for (var i = 0; i < animator.textInfo.characterCount; i++) { if (!animator.textInfo.characterInfo[i].isVisible) continue; animator.SetCharOffset(i, offset); } return animator; } public static DOTweenTMPAnimator SetAllCharScales(this DOTweenTMPAnimator animator, float scale) { for (var i = 0; i < animator.textInfo.characterCount; i++) { if (!animator.textInfo.characterInfo[i].isVisible) continue; animator.SetCharScale(i, Vector3.one * scale); } return animator; } public static void WobbleChars(this DOTweenTMPAnimator animator, Vector2 sinAmplitude, Vector2 sinFrequency) { for (var i = 0; i < animator.textInfo.characterCount; i++) { if (!animator.textInfo.characterInfo[i].isVisible) continue; var times = sinFrequency * ((Time.timeSinceLevelLoad + i) * 2 * Maths.PI); var offset = sinAmplitude * new Vector2(Maths.Sin(times.x), Maths.Sin(times.y)); animator.SetCharOffset(i, offset.ToVector3()); } } } }