using System; using System.Threading; using System.Threading.Tasks; using Febucci.UI.Core; using UnityEngine; using AibisDream.Utility; using AibisDream.Framework; namespace AibisDream { public class CenterText : MonoBehaviour, ILineView { [SerializeField] private TypewriterCore content; [SerializeField] private GameObject box; private CancellationTokenSource _autoHideToken; private event Action OnTextShowed; // ---------------------------- 显示逻辑 ---------------------------- public void RunLine(LineSyncToken syncToken) { // 先中断结束事件 _autoHideToken?.Cancel(); _autoHideToken = null; // 注册事件 OnTextShowed += syncToken.TextShown; syncToken.SkipTextAnima += () => content.SkipTypewriter(); syncToken.OnAdvance += AfterAdvance; // 播放文字 content.TextAnimator.SetText(string.Empty); box.SetActive(true); content.ShowText(syncToken.lineInfo.lineText); syncToken.TextStart(); } private async void AfterAdvance() { _autoHideToken = new CancellationTokenSource(); try { await Task.Delay(ConstRef.AutoHideDelay, _autoHideToken.Token); HideDialog(); } catch (TaskCanceledException) { // 忽略取消 } } public void HideDialog() { box.SetActive(false); } // ---------------------------- 生命周期 ---------------------------- private void Awake() { box.SetActive(false); } private void Start() { DialogUIManager.Instance.RegisterScreenView(DialogViewType.CenterText, this); RegisterEvents(); } private void OnDestroy() { DialogUIManager.Instance.UnRegisterScreenView(DialogViewType.CenterText); UnregisterEvents(); OnTextShowed = null; } private void RegisterEvents() { // 全局事件 EnumEventSystem.Global.Register(DialogEventEnum.OptionShow, OnOptionShow); // 文本事件 content.onTextShowed.AddListener(TextShowed); } private void UnregisterEvents() { // 全局事件 EnumEventSystem.Global.UnRegister(DialogEventEnum.OptionShow, OnOptionShow); // 文本事件 content.onTextShowed.RemoveListener(TextShowed); } private void TextShowed() { OnTextShowed?.Invoke(); OnTextShowed = null; } private void OnOptionShow() { _autoHideToken?.Cancel(); _autoHideToken = null; HideDialog(); } } }