using System.Collections; using UnityEngine; using TMPro; namespace BaseGames.Tutorial { /// /// 教程提示 UI 组件(架构 21_LiquidPuzzleModule §17)。 /// 负责显示/隐藏提示面板和文字;duration ≤ 0 时不自动消隐。 /// 使用 CanvasGroup 实现淡入淡出,不依赖 Animator。 /// [RequireComponent(typeof(CanvasGroup))] public class TutorialHintUI : MonoBehaviour { [SerializeField] private TMP_Text _label; [SerializeField] private float _fadeSpeed = 4f; private CanvasGroup _cg; private Coroutine _autoHideCoroutine; private Coroutine _fadeCoroutine; private void Awake() { _cg = GetComponent(); _cg.alpha = 0f; gameObject.SetActive(false); } // ── 公共 API ────────────────────────────────────────────────────── /// 淡入显示提示文字。duration ≤ 0 时不自动消隐。 public void Show(string text, float duration = 0f) { if (_label != null) _label.text = text; // 停止所有进行中的动画/定时 StopAutoHide(); StopFade(); gameObject.SetActive(true); _fadeCoroutine = StartCoroutine(FadeTo(1f)); if (duration > 0f) _autoHideCoroutine = StartCoroutine(AutoHideRoutine(duration)); } /// 淡出并隐藏提示面板。 public void Hide() { StopAutoHide(); StopFade(); _fadeCoroutine = StartCoroutine(FadeOutAndDeactivate()); } // ── 内部 ────────────────────────────────────────────────────────── private void StopAutoHide() { if (_autoHideCoroutine == null) return; StopCoroutine(_autoHideCoroutine); _autoHideCoroutine = null; } private void StopFade() { if (_fadeCoroutine == null) return; StopCoroutine(_fadeCoroutine); _fadeCoroutine = null; } private IEnumerator AutoHideRoutine(float duration) { yield return new WaitForSecondsRealtime(duration); Hide(); _autoHideCoroutine = null; } private IEnumerator FadeTo(float target) { while (!Mathf.Approximately(_cg.alpha, target)) { _cg.alpha = Mathf.MoveTowards(_cg.alpha, target, _fadeSpeed * Time.unscaledDeltaTime); yield return null; } _cg.alpha = target; } private IEnumerator FadeOutAndDeactivate() { yield return FadeTo(0f); gameObject.SetActive(false); _fadeCoroutine = null; } } }