✌️TextMeshPro와 Dotween

유니티 개발에 정말 유용하게 쓰고있는 DoTween
하지만 아직은... 무료버전을 쓰고있다
무료버전에도 풍부한 기능이 있지만 아쉽게도 TextMeshPro의 `DoText`기능은 Pro버전에서만 지원한다

언젠간 DotweenPro를 사겠지만 지금은 일단 무료버전을 계속 쓸 예정이기에 직접 구현해본다
🔥구현
먼저 방법은 여러가지가 있지만 나는 static클래스에 `TMP_Text`타입의 확장 메서드를 구현할거고,
코루틴을 쓰지 않을것이다 이유는
코루틴을 쓸려면 `MonoBehaviour`를 상속받아야 하거나 `MonoBehaviour`를 상속받는 싱글톤 코루틴 러너를 만들어야 하는데,
상속받는거는 static클래스라서 안되고 코루틴 러너 싱글톤을 만드는건 뭔가 덜 깔끔해보였기 때문이다
그리고 또 하나 신경쓸점은 `Tweener`타입을 리턴해서 `.SetLoop `나 `.SetEase`같은 확장 메서드를 연결할 수 있게 구현할 것이다
✅세줄요약
1. static클래스 + 확장 메서드
2. 코루틴 X
3. 리턴타입 Tweenr
📝코드
using UnityEngine;
using TMPro;
using DG.Tweening;
public static class TMPDoTweenExtensions
{
    // 원래 텍스트를 덮어씌우면서 DoText
    public static Tweener DoText(this TMP_Text text, string targetText, float duration)
    {
        // 현재 텍스트를 초기값으로 설정
        string currentText = text.text;
        // DOTween의 To 메서드를 사용하여 텍스트를 점진적으로 변경
        return DOTween.To(
            () => currentText, // 현재 텍스트 값
            x => text.text = x, // 텍스트 업데이트
            targetText, // 목표 텍스트
            duration 
            ).SetEase(Ease.Linear); // 디폴트는 Linear Ease로
    }
    
    // 원래 텍스트는 싹 지우고 DoText
    public static Tweener DoTextClean(this TMP_Text text, string targetText, float duration)
    {
        int currentLength = 0;
        return DOTween.To(
            () => currentLength,
            x =>
            {
                currentLength = x;
                text.text = targetText.Substring(0, currentLength);
            },
            targetText.Length,
            duration
            ).SetEase(Ease.Linear);
    }
}
✏️ 설명과 실행
1️⃣ `DoText`와 `DoTextClean`


`DoText` ➡️ 원래 텍스트를 덮어씌우면서 한글자 한글자 채워나가는 함수
`DoTextClean` ➡️ 원래 텍스트를 싹 지우고 한글자 한글자 채워나가는 함수
원래 Dotween의 `DoText`는 첫번째 기능과 같다
두번째 `DoTextClean`은 사실 실수로 처음엔 이렇게 작동하는줄 알고 구현했는데,
두면 쓸데가 있지않을까...해서 남겨둔 함수이다
2️⃣ `DoTween.To()` 활용
리턴값을 `Tweener`타입으로 반환해야 `.SetEase`나 `.SetLoop`같은 옵션을 추가할 수 있기 때문에 내부 구현은 `Tweener`를 생성하는 DoTween함수를 활용해야했다 그래서 `DoTween.To()` 함수를 활용했다
📌 `DoTween.To()` 함수의 구조
public static Tweener To(
    DG.Tweening.Core.DOGetter<float> getter,   // 현재 값을 가져오는 함수
    DG.Tweening.Core.DOSetter<float> setter,   // 값을 설정하는 함수
    float endValue,                            // 목표 값
    float duration                             // 지속 시간
)
- getter
- 시작값을 넣는다
 
 - setter
- 값을 업데이트하는 함수를 넣는다
 - 매 프레임마다 보간된 값이 인자로 전달된다
 
 - endValue
- 최종적으로 도달해야될 값이다
 
 
3️⃣ `.SetLoop`, `.SetEase`옵션 동작
loadingText.DoText("테스트 테스트", 1f).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.OutBounce);

내부적으로 DoTween의 함수를 써서 구현했고, 그걸로 생성되는 `Tweener`타입 인스턴스를 리턴하기때문에 따로 구현해줄 필요 없이 하던대로 뒤에 붙이면 작동한다
🍎결론
나중에 꼭 제작자를 리스펙하는 마음을 담아 Pro버전을 구매하자!!
'Unity > UI' 카테고리의 다른 글
| [Unity] 스크롤 렉트 스크롤에 따라 Element들 스케일 효과 주기 (0) | 2024.07.01 | 
|---|---|
| [Unity] Grid Layout Group 좌우 여백 동적으로 균등하게 맞추기 (0) | 2024.06.11 | 
| [Unity] UI 롱 클릭 이벤트 처리 with UniRx (0) | 2024.06.11 | 
| [Unity] Button을 상속받아 커스텀하기 (0) | 2023.03.09 | 
| [Unity] UI드래그로 이동 시킬 때 범위 제한 (0) | 2022.08.29 |