using DG.Tweening; using System.Collections.Generic; using UnityEngine; namespace vnxbqy.UI { public class FairySiegeStoryWin : Window { [SerializeField] ClickScreenOtherSpace clickScreenOtherSpace; [SerializeField] List fairySiegeStoryInfoItems = new List(); TextGenerator generator; [SerializeField] ImageEx imgBk; [SerializeField] Transform tranTitle; [SerializeField] TextEx txtContinue; [SerializeField] RichText txtSkip; [SerializeField] TextEx txtTemp; [SerializeField] TextEx txtTitle; int currentLineIndex; FairySiegeActModel model { get { return ModelCenter.Instance.GetModel(); } } #region Build-in protected override void AddListeners() { clickScreenOtherSpace.RemoveAllListeners(); clickScreenOtherSpace.AddListener(OnClickScreenOtherSpace); } protected override void BindController() { } protected override void OnPreOpen() { model.fairySiegeStoryShowAllAction += OnFairySiegeStoryShowAll; model.fairySiegeStoryExitAction += OnFairySiegeStoryExit; DisPlay(); } protected override void OnPreClose() { model.fairySiegeStoryShowAllAction -= OnFairySiegeStoryShowAll; model.fairySiegeStoryExitAction -= OnFairySiegeStoryExit; } protected override void OnAfterOpen() { } protected override void OnAfterClose() { } #endregion private void OnFairySiegeStoryExit() { Exit(); } private void OnFairySiegeStoryShowAll() { ShowAll(); } private void DisPlay() { InitInfo(); Reset(); PlayBkSeq(); PlayRowSeq(); } private void InitInfo() { var str = Language.Get("FairySiegeStoryInfo"); txtTemp.text = str; txtTemp.SetActive(false); generator = new TextGenerator(); var settings = txtTemp.GetGenerationSettings(txtTemp.rectTransform.rect.size); generator.Populate(str, settings); if (fairySiegeStoryInfoItems.Count < generator.lines.Count) { DebugEx.LogError("行数不足,展示不全"); CloseClick(); return; } for (var i = 0; i < fairySiegeStoryInfoItems.Count; i++) if (i < generator.lines.Count) { fairySiegeStoryInfoItems[i].SetActive(true); var line = generator.lines[i]; var charCount = i < generator.lines.Count - 1 ? generator.lines[i + 1].startCharIdx - line.startCharIdx : str.Length - line.startCharIdx; var subStr = str.Substring(line.startCharIdx, charCount); fairySiegeStoryInfoItems[i].txtInfo.text = subStr; fairySiegeStoryInfoItems[i].canvasGroup.alpha = 0; } else { fairySiegeStoryInfoItems[i].SetActive(false); } } private void Reset() { ResetRowSeq(); ResetBkSeq(); txtContinue.SetActive(true); currentLineIndex = 0; // 重置行索引 txtTitle.text = Language.Get("FairySiegeStoryTitle"); model.isFairySiegeStoryPlaying = true; } #region 播放行动画 private void PlayRowSeq() { if (currentLineIndex >= generator.lines.Count) return; StopRowSeq(); var currentItem = fairySiegeStoryInfoItems[currentLineIndex]; currentItem.SetActive(true); currentItem.canvasGroup.alpha = 0; // 重置为新动画起点 txtContinue.SetActive(currentLineIndex + 1 == generator.lines.Count); if (currentLineIndex + 1 == generator.lines.Count) { model.isFairySiegeStoryPlaying = false; } seqRow.Append(currentItem.canvasGroup.DOFade(1, 1f)).SetEase(Ease.OutQuad).OnComplete(() => { currentLineIndex++; PlayRowSeq(); }); } float lastClickTime; private void OnClickScreenOtherSpace() { if (Time.time - lastClickTime < 0.2f) return; lastClickTime = Time.time; StopRowSeq(); // 立即完成当前行动画 if (currentLineIndex < generator.lines.Count) { var currentItem = fairySiegeStoryInfoItems[currentLineIndex]; currentItem.canvasGroup.alpha = 1; } // 计算有效下一行 var nextLine = currentLineIndex + 1; if (nextLine < generator.lines.Count) { currentLineIndex = nextLine; PlayRowSeq(); } else { Exit(); } } private void Exit() { model.isFairySiegeStoryPlaying = false; currentLineIndex = generator.lines.Count; CloseClick(); } private void ShowAll() { Reset(); for (var i = 0; i < fairySiegeStoryInfoItems.Count; i++) { if (i < generator.lines.Count) { fairySiegeStoryInfoItems[i].SetActive(true); fairySiegeStoryInfoItems[i].canvasGroup.alpha = 1; } else { fairySiegeStoryInfoItems[i].SetActive(false); } } currentLineIndex = generator.lines.Count - 1; txtContinue.SetActive(true); model.isFairySiegeStoryPlaying = false; } Sequence seqRow; private void StopRowSeq(bool complete = false) { seqRow?.Kill(complete); seqRow = DOTween.Sequence(); } private void ResetRowSeq() { StopRowSeq(); for (var i = 0; i < fairySiegeStoryInfoItems.Count; i++) { fairySiegeStoryInfoItems[i].SetActive(false); fairySiegeStoryInfoItems[i].canvasGroup.alpha = 0; } } #endregion #region 背景图移动 Sequence seqBk; private void PlayBkSeq() { seqBk.Append(imgBk.rectTransform.DOAnchorPosY(240, 10f).SetEase(Ease.OutQuad)); } private void StopBkSeq(bool complete = false) { seqBk?.Kill(complete); seqBk = DOTween.Sequence(); } private void ResetBkSeq() { StopBkSeq(); imgBk.rectTransform.anchoredPosition = new Vector3(0, 0, 0); } #endregion } }