![Dotween tmp.pro DoText 함수 직접 구현하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Z9FF%2Fbtsaw5pPMjb%2FmQxUAplqOgWKUovKRX7mjk%2Fimg.gif)
Dotween 무료버전은 Tmp.Pro를 지원해주지 않는다.
로고씬을 구현하던 와중 일반 Text로 크기를 키우니 너무 깨져서 나왔다.
Dotween 에셋을 이용해서 편하게 구현하고 있었기 때문에 TMP.Pro로 바꿔서 사용하려고 하는데 이게 무슨일..
Dotween 문서를 확인해보니 TMP.Pro 는 Dotween Pro 버전만 지원을 하고있었다.
회사에서는 pro버전을 사용하고 있지만.. 개인적으로 pro버전을 산것은 아니였고,
내가 쓸 기능들은 무료버전으로도 충분했기 때문에 TMP.Pro의 DoText 함수 기능만 직접 구현 해보기로 했다.
코루틴 만들기
버전1
IEnumerator DoText(TMPro.TMP_Text text, string endValue, float duration)
{
float charPerTime = duration / endValue.Length;
string tempString = null;
float tempTime = 0.0f;
int tempIndex = 0;
while (tempIndex != endValue.Length)
{
tempTime += Time.deltaTime;
if (tempTime >= charPerTime)
{
tempString += endValue[tempIndex];
text.text = tempString;
tempTime = 0.0f;
tempIndex++;
}
yield return null;
}
}
처음엔 한 글자마다의 시간을 계산해서 매 프레임마다 시간을 더해서 체크하는 방식으로 구현을 했다.
작동하긴 하지만 지역변수도 많고 뭔가 조잡한 느낌이였다.
버전2
IEnumerator DoText(TMPro.TMP_Text text, string endValue, float duration)
{
WaitForSeconds charPerTime = new WaitForSeconds(duration/endValue.Length);
string tempString = null;
int tempIndex = 0;
while (tempIndex != endValue.Length)
{
tempString += endValue[tempIndex++];
text.text = tempString;
yield return charPerTime;
}
}
두번째는 WaitForSeconds 인스턴스를 계산한 시간으로 생성해주고,
코루틴의 yield return에 해당 인스턴스를 리턴해주는 방식으로 구현을 했다.
이렇게 되면 계산한 시간마다 while문이 실행되기 때문에 원하는대로 잘 작동했다.
버전3
IEnumerator DoText(TMPro.TMP_Text text, string endValue, float duration)
{
string tempString = null;
WaitForSeconds charPerTime = new WaitForSeconds(duration / endValue.Length);
for (int i = 0; i < endValue.Length; i++)
{
tempString += endValue[i];
text.text = tempString;
yield return charPerTime;
}
}
세번째는 for문을 이용해서 구현했다.
두번째 방법에서 while문을 for문으로 바꾼거기 때문에 다를것은 없지만 뭔가 깔끔한 느낌이 들었다.
TMP.Pro의 확장 메서드로 만들기
logo.DOScale(Vector3.one * 4.0f, 1.5f).SetEase(Ease.InOutBack).OnComplete(() =>
{
//우리가 쓰던 Dotween 코드
//logoText.DoText("HornSquid Studio",1.0f);
StartCoroutine(DoText(logoText, "HornSquid Studio", 1.0f));
});
우리는 늘 해당변수에 Do- 라는 접두사를 붙여서 원하는 함수를 편하게 사용했다.
하지만 내가 위에 만든건 StartCoroutine으로 해당 코루틴을 써야한다.
물론 그렇게 불편한건 아니지만, 해당 클래스에만 TMP.Pro의 기능을 쓸것도 아니고,
앞으로 TMP.Pro를 많이 쓸수도 있으니 확장 메서드로 DoText함수를 만들어 놓았다.
확장 메서드를 위한 정적 클래스 만들기
일단 확장메서드를 만들기 위해서는
1. 무조건 정적 클래스 (Static Class) 로 만들어주어야한다.
2. 그리고 무조건 this 키워드를 이용해서 확장 메서드를 만들 클래스를 첫번째 매개변수로 만들어야한다.
하지만 이렇게 만들어버리면 문제가 생긴다.
바로 코루틴을 실행하기 위한 MonoBehavior에 있는 StartCoroutine 함수를 사용하지 못한다는 것..
그리고 정적인 클래스는 Monobehavior를 상속받지 못한다.
일반 클래스에서는 프로그램의 시작과 끝을 함께하는 Static 클래스의 함수를 언제든 호출할 수 있지만,
반대로 정적인 클래스에서는 호출할때 있을지 없을지 모르는 일반 클래스의 함수를 호출할 수 없다.
Static Class에서 StartCoroutine 함수를 쓰기위한 방법
🟡 1 .코루틴을 대신 호출할 클래스 만들기 (사용X)
첫번째로 Dotween처럼 사용하기 위해서는 늘 존재하는 싱글톤 클래스를 만들어서 StartCoroutine 함수만을 대신 실행해주는 객체를 만들어놓고 정적 클래스에서 코루틴을 사용할때마다 그 객체에서 해당 함수를 호출하는 방법이 있다.
Dotween을 사용해도 저런 오브젝트가 항상 생기는데, 아마 정적인 클래스에서는 쓸 수 없는 기능을 대신 하는 오브젝트가 아닐까 추측만 해본다. (뇌피셜)
🟡 2. 호출하는 객체의 MonoBehavior 클래스를 매개변수로 받기
StartCoroutine 함수를 사용하기 위해서는 MonoBehavior를 상속받은 객체만 있으면 된다.
그래서 아래와 같이 코드를 작성했다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class GameSystem
{
/// <summary>
/// TMP.Pro를 한글자씩 출력합니다.
/// </summary>
public static void DoText(this TMPro.TMP_Text text, string endValue,float duration,MonoBehaviour monoClass)
{
monoClass.StartCoroutine(CoText(text, endValue, duration));
}
static IEnumerator CoText(TMPro.TMP_Text text, string endValue, float duration)
{
WaitForSeconds charPerTime = new WaitForSeconds(duration / endValue.Length);
string tempString = null;
for(int i=0; i < endValue.Length; i++)
{
tempString += endValue[i];
text.text = tempString;
yield return charPerTime;
}
}
}
유니티에서 TMP.Pro 의 텍스트를 출력하기위해 해당 함수를 호출하는 클래스라면 무조건 모노비헤이비어 클래스를 상속받고 있을것이기 때문에..
함수를 사용할때 입력할 인자값이 1개가 늘어난다는것만 빼면 1번처럼 싱글톤 객체를 생성해놓고 불러오는것보다는 괜찮을거 같다고 생각했다.
이제 이 만든 함수를 사용할 위치로 가서 입력해보면 만든 확장 메서드가 잘 나오는것을 볼 수 있다.
마지막 인자값에는 this로 해당 클래스를 넘겨주면 끝이다.
끝
'게임 엔진 > Unity' 카테고리의 다른 글
[유니티 에셋 추천] Odin Inspector and Serializer (0) | 2023.05.13 |
---|---|
[유니티 에셋 추천] All In 1 Sprite Shader (6) | 2023.04.25 |
유니티 로컬라이제이션 기능 사용해보기 (6) | 2023.02.26 |
유니티 노치, 펀치홀 디자인 대응하기 (0) | 2023.02.26 |
유니티로 구글 애드몹(AdMob) 테스트 해보기 (0) | 2023.01.29 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!