using System; using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; using UnityEngine.Events; public class UITextShow : MonoBehaviour { private TMPro.TextMeshProUGUI _text; private Coroutine coroutine; public UnityEvent OnTimeTick; public UnityEvent OnTimeEnd; private void Awake() { _text = GetComponent(); } public void SetText(string text) { _text.SetText(text); } public void ShowSubtitle(string text, float delay, float afterDelay, Action onStart, Action onEnd) { if (coroutine != null) { StopCoroutine(coroutine); } coroutine = StartCoroutine(Subtitle_Coroutine(text, delay, afterDelay, onStart, onEnd)); } public void ShowTimer(int time, string afterTimerText, float afterDelay, Action onStart, Action onEnd) { if (coroutine != null) { StopCoroutine(coroutine); } StartCoroutine(Timer_Coroutine(time, afterTimerText, afterDelay, onStart, onEnd)); } private IEnumerator Timer_Coroutine(int time, string afterTimerText, float afterDelay, Action onStart, Action onEnd) { onStart?.Invoke(); for (int i = time; i > 0; i--) { _text.SetText(i.ToString()); OnTimeTick?.Invoke(); yield return new WaitForSeconds(1); } _text.SetText(afterTimerText); yield return new WaitForSeconds(afterDelay); _text.SetText(string.Empty); OnTimeEnd?.Invoke(); onEnd?.Invoke(); } private IEnumerator Subtitle_Coroutine(string text, float delay, float afterDelay, Action onStart, Action onEnd) { onStart?.Invoke(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < text.Length; i++) { sb.Append(text[i]); _text.SetText(sb); yield return new WaitForSeconds(delay); } yield return new WaitForSeconds(afterDelay); _text.SetText(string.Empty); onEnd?.Invoke(); } }