using DG.Tweening;
|
using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using UnityEngine;
|
|
//战斗力增加
|
public class PowerAddWin : UIBase
|
{
|
[SerializeField] TextEx txtBase; //提升或降低前的战斗力
|
[SerializeField] TextEx txtChange; //战斗力变化了多少
|
[SerializeField] List<Font> changeFonts; //战力变化的字体
|
[SerializeField] ImageEx imgArrow; //箭头
|
[SerializeField] Transform transZhanLi; //战力整体框
|
[SerializeField] Transform transZhanLiNumAll; //战力所有变化部分
|
[SerializeField] RectTransform transChange; //箭头和变化数字整体框
|
string uiFrameKey = "zhanli_dt";
|
[SerializeField] UIFrame uiFrame;
|
//[SerializeField] List<PowerUpPosition> powerUpPositions;
|
|
|
|
[Header("淡入后移动开始前等待时间/s")]
|
[SerializeField] float moveStartWaitTime;
|
|
[Header("变化值移动")]
|
[SerializeField] float moveDuration; //变化值移动动画完成时间
|
|
[SerializeField] Ease moveEaseType;
|
|
[Header("变化值透明度降到0")]
|
[SerializeField] float textFadeDuration; //变化值透明度降到0的时间
|
|
[SerializeField] Ease textFadeEaseType;
|
|
[Header("数字滚动")]
|
[SerializeField] float rollDuration; //数字滚动动画完成时间
|
|
[SerializeField] float rollCount; //数字滚动次数
|
[SerializeField] Ease rollEaseType;
|
|
[Header("移动结束后淡出开始前等待时间/s")]
|
[SerializeField] float moveEndWaitTime;
|
|
|
[Header("战力数字位置计算相关")]
|
[SerializeField] float txtBaseMultiple; //前置的战力数字字母距离倍数
|
|
[SerializeField] float txtChangeMultiple; //后置的战力数字字母距离倍数
|
[SerializeField] int baseFontWidth; //前置的战力数字字母一个多大
|
[SerializeField] int changeFontWidth; //后置的战力数字字母一个多大
|
[SerializeField] float baseAndChangeInterval; //前置和后置的战力数字中间的间隔大小
|
[SerializeField] float changeAndArrowInterval; //后置的战力数字和箭头之间的间隔大小
|
[SerializeField] float transChangeY; //Change组件的Y值
|
[SerializeField] float intArrowAddInterval; //增加或减少值是整数时,后置的战力数字和箭头之间的间隔增加多少
|
private float fadeInEndTime; // 播完淡入动画后的时间
|
private float moveEndTime; // 播完移动动画后的时间
|
long basePower;
|
long nowPower;
|
long changePower;
|
bool isAdd;
|
|
private enum AnimeState
|
{
|
FadeIn,
|
WaitMove,
|
Move,
|
WaitFadeOut,
|
FadeOut,
|
}
|
|
AnimeState nowState;
|
|
#region Built-in
|
|
|
protected override void OnPreOpen()
|
{
|
PlayerMainDate.Instance.AddPowerEvent += ResetToWaitMove;
|
ResetToFadeIn();
|
}
|
|
|
|
protected override void OnPreClose()
|
{
|
PlayerMainDate.Instance.AddPowerEvent -= ResetToWaitMove;
|
}
|
|
protected override void OnOpenAnimationComplete()
|
{
|
fadeInEndTime = Time.time;
|
nowState = AnimeState.WaitMove;
|
|
uiFrame.SetActive(true);
|
uiFrame.SetLoopCount(1);
|
uiFrame.ResetFrame(uiFrameKey);
|
}
|
|
#endregion
|
|
Sequence sequence;
|
Sequence textChangeSequence;
|
Sequence fadeOutSequence;
|
|
protected void LateUpdate()
|
{
|
if (nowState == AnimeState.WaitMove)
|
{
|
if (Time.time - fadeInEndTime > moveStartWaitTime)
|
{
|
nowState = AnimeState.Move;
|
|
sequence = DOTween.Sequence();
|
sequence.Join(transChange.DOMove(new Vector3(txtBase.rectTransform.position.x, transChange.position.y, transChange.position.z), moveDuration).SetEase(moveEaseType));
|
sequence.Join(txtChange.DOFade(0f, textFadeDuration).SetEase(textFadeEaseType));
|
sequence.Join(imgArrow.DOFade(0f, textFadeDuration).SetEase(textFadeEaseType));
|
|
textChangeSequence = DOTween.Sequence();
|
float rollTime = rollDuration / rollCount;
|
for (int i = 0; i < rollCount + 1; i++)
|
{
|
long changeValue = changePower / (int)rollCount * (i + 1);
|
long nowValue;
|
if (i == rollCount)
|
{
|
nowValue = nowPower;
|
sequence.Append(txtBase.DOText(DisplayBasePowerNum(nowValue), rollTime).SetEase(rollEaseType).OnComplete(() => { SetInitPosition(nowValue, changePower, isAdd); }));
|
}
|
else
|
{
|
if (isAdd)
|
{
|
nowValue = basePower + changeValue;
|
sequence.Append(txtBase.DOText(DisplayBasePowerNum(nowValue), rollTime).SetEase(rollEaseType).OnComplete(() => { SetInitPosition(nowValue, changePower, isAdd); }));
|
}
|
else
|
{
|
nowValue = basePower - changeValue;
|
sequence.Append(txtBase.DOText(DisplayBasePowerNum(nowValue), rollTime).SetEase(rollEaseType).OnComplete(() => { SetInitPosition(nowValue, changePower, isAdd); }));
|
}
|
}
|
// #if UNITY_EDITOR
|
// Debug.Log($"count {i} changeValue {changeValue} nowValue {nowValue} isAdd {isAdd} basePower {basePower} changePower {changePower} nowPower {nowPower} rollTime {rollTime}");
|
// #endif
|
}
|
sequence.Join(textChangeSequence);
|
|
sequence.OnComplete(() =>
|
{
|
moveEndTime = Time.time;
|
nowState = AnimeState.WaitFadeOut;
|
});
|
}
|
}
|
else if (nowState == AnimeState.WaitFadeOut)
|
{
|
CloseWindow();
|
}
|
|
}
|
|
private void ResetToFadeIn()
|
{
|
sequence.Kill();
|
textChangeSequence.Kill();
|
fadeOutSequence.Kill();
|
uiFrame.SetActive(false);
|
fadeInEndTime = 0;
|
moveEndTime = 0;
|
CheckPosition();
|
SetNum();
|
SetInitPosition(basePower, changePower, isAdd);
|
ResetColorA();
|
DisplayNum();
|
nowState = AnimeState.FadeIn;
|
}
|
|
private void ResetToWaitMove()
|
{
|
sequence.Kill();
|
textChangeSequence.Kill();
|
fadeOutSequence.Kill();
|
uiFrame.SetActive(false);
|
fadeInEndTime = Time.time;
|
moveEndTime = 0;
|
SetNum();
|
SetInitPosition(basePower, changePower, isAdd);
|
ResetColorA();
|
DisplayNum();
|
|
uiFrame.SetActive(true);
|
uiFrame.SetLoopCount(1);
|
uiFrame.ResetFrame(uiFrameKey);
|
nowState = AnimeState.WaitMove;
|
}
|
|
private void SetInitPosition(long basePower, long changePower, bool isAdd)
|
{
|
txtBase.rectTransform.anchorMin = new Vector2(0, 0);
|
txtBase.rectTransform.anchorMax = new Vector2(0, 0);
|
txtBase.rectTransform.pivot = new Vector2(0, 0);
|
txtBase.rectTransform.anchoredPosition = new Vector2(0, 0);
|
|
transChange.anchorMin = new Vector2(0, 0);
|
transChange.anchorMax = new Vector2(0, 0);
|
transChange.pivot = new Vector2(0, 0);
|
string displayBasePowerNum = DisplayBasePowerNum(basePower);
|
int txtBaseTransWidth = GetBaseTransWidth(displayBasePowerNum);
|
float x = txtBaseTransWidth * txtBaseMultiple + baseAndChangeInterval;
|
transChange.anchoredPosition = new Vector2(x, transChangeY);
|
|
txtChange.rectTransform.anchorMin = new Vector2(0, 0);
|
txtChange.rectTransform.anchorMax = new Vector2(0, 0);
|
txtChange.rectTransform.pivot = new Vector2(0, 0);
|
txtChange.rectTransform.anchoredPosition = new Vector2(0, 0);
|
|
imgArrow.rectTransform.anchorMin = new Vector2(0, 0);
|
imgArrow.rectTransform.anchorMax = new Vector2(0, 0);
|
imgArrow.rectTransform.pivot = new Vector2(0, 0);
|
string displayChangePowerNum = DisplayChangePowerNum(isAdd, changePower);
|
int txtChangeTransWidth = GetChangeTransWidth(displayChangePowerNum);
|
x = txtChangeTransWidth * txtChangeMultiple + changeAndArrowInterval;
|
if (!IsHasPoint(changePower))
|
{
|
x += intArrowAddInterval;
|
}
|
imgArrow.rectTransform.anchoredPosition = new Vector2(x, 0);
|
}
|
|
private bool IsHasPoint(long changePower)
|
{
|
var chars = UIHelper.ReplaceLargeArtNum(changePower);
|
for (int i = 0; i < chars.Length; i++)
|
{
|
if (chars[i] == '.')
|
{
|
return true;
|
}
|
}
|
return false;
|
}
|
|
private int GetBaseTransWidth(string numStr)
|
{
|
return Mathf.CeilToInt(numStr.Length * baseFontWidth);
|
}
|
|
private int GetChangeTransWidth(string numStr)
|
{
|
return Mathf.CeilToInt(numStr.Length * changeFontWidth);
|
}
|
|
private void SetNum()
|
{
|
nowPower = (long)PlayerMainDate.Instance.prowNum;
|
changePower = (long)PlayerMainDate.Instance.prowNumChange;
|
isAdd = PlayerMainDate.Instance.isAdd;
|
basePower = isAdd ? nowPower - changePower : nowPower + changePower;
|
}
|
|
private void DisplayNum()
|
{
|
txtBase.text = DisplayBasePowerNum(basePower);
|
txtChange.text = DisplayChangePowerNum(isAdd, changePower);
|
txtChange.font = changeFonts[isAdd ? 0 : 1];
|
imgArrow.SetSprite(DisplayState(isAdd));
|
}
|
|
private string DisplayState(bool isAdd)
|
{
|
return StringUtility.Contact(isAdd ? "FightPointUP" : "FightPointDown");
|
}
|
|
private string DisplayBasePowerNum(long basePower)
|
{
|
StringBuilder stringBuild = new StringBuilder();
|
stringBuild.Append(basePower);
|
return stringBuild.ToString();
|
}
|
|
private string DisplayChangePowerNum(bool isAdd, long changePower)
|
{
|
var chars = UIHelper.ReplaceLargeArtNum(changePower);
|
|
StringBuilder stringBuild = new StringBuilder();
|
if (isAdd)
|
{
|
stringBuild.Append("+");
|
}
|
else
|
{
|
stringBuild.Append("-");
|
}
|
stringBuild.Append(chars);
|
return stringBuild.ToString();
|
}
|
|
|
|
private void ResetColorA()
|
{
|
Color textColor = txtChange.color;
|
textColor.a = 1f;
|
txtChange.color = textColor;
|
textColor = imgArrow.color;
|
textColor.a = 1f;
|
imgArrow.color = textColor;
|
}
|
|
private void CheckPosition()
|
{
|
// var type = WindowType.None;
|
|
// var _index = powerUpPositions.FindIndex((x) =>
|
// {
|
// return x.windowType == type;
|
// });
|
// if (_index != -1)
|
// {
|
// transZhanLi.transform.localPosition = powerUpPositions[_index].position;
|
// }
|
}
|
|
[Serializable]
|
public struct PowerUpPosition
|
{
|
public WindowType windowType;
|
public Vector3 position;
|
}
|
|
public enum WindowType
|
{
|
None,
|
}
|
}
|