using DG.Tweening;
|
using System.Collections.Generic;
|
using UnityEngine;
|
|
namespace vnxbqy.UI
|
{
|
public class FairySiegeStoryWin : Window
|
{
|
[SerializeField] ClickScreenOtherSpace clickScreenOtherSpace;
|
[SerializeField] List<FairySiegeStoryInfoItem> fairySiegeStoryInfoItems = new List<FairySiegeStoryInfoItem>();
|
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<FairySiegeActModel>(); } }
|
|
#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
|
}
|
}
|