using System; using System.Threading; using System.Threading.Tasks; using Febucci.UI.Core; using UnityEngine; using AibisDream.Framework; using AibisDream.Utility; namespace AibisDream { public class OnelineBox : MonoBehaviour, ILineView { [SerializeField] private TypewriterCore content; [SerializeField] private GameObject box; private CancellationTokenSource _autoHideToken; private event Action OnTextShowed; // ---------------------------- 显示逻辑 ---------------------------- public void RunLine(LineSyncToken syncToken) { Debug.Log("OnelineBox: " + syncToken.lineInfo.lineText); // 先中断结束事件 _autoHideToken?.Cancel(); _autoHideToken = null; // 注册事件 OnTextShowed += syncToken.TextShown; syncToken.SkipTextAnima += () => content.SkipTypewriter(); syncToken.OnAdvance += AfterAdvance; // 播放文字 content.TextAnimator.SetText(string.Empty); Debug.Log("OnelineBox: " + GetOneLineText(syncToken.lineInfo)); box.SetActive(true); content.ShowText(GetOneLineText(syncToken.lineInfo)); syncToken.TextStart(); Debug.Log("OnelineBox: TextStart"); } private string GetOneLineText(LineInfo lineInfo) { if (string.IsNullOrEmpty(lineInfo.character.GetActorName())) { return lineInfo.lineText; } return $"{lineInfo.character.GetActorName()}: {lineInfo.lineText}"; } 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.OnelineBox, this); RegisterEvents(); } private void OnDestroy() { DialogUIManager.Instance.UnRegisterScreenView(DialogViewType.OnelineBox); 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(); } } }