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 changeFonts; //战力变化的字体 [SerializeField] ImageEx imgArrow; //箭头 [SerializeField] Transform transZhanLi; //战力整体框 [SerializeField] Transform transZhanLiNumAll; //战力所有变化部分 [SerializeField] RectTransform transChange; //箭头和变化数字整体框 string uiFrameKey = "zhanli_dt"; [SerializeField] UIFrame uiFrame; //[SerializeField] List 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, } }