✌️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 |