| 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,  | 
|     }  | 
| } |