using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; using URandom = UnityEngine.Random; public class ResShower : MonoBehaviour { public Action DelResRefresh; [SerializeField] GameObject mTplCurrency; [SerializeField] RectTransform mRctBg; [SerializeField] RectTransform mRctCurrencyIcon; [SerializeField] Text mTxtCurrency; [SerializeField] Text mTxtCurrencyChange; [SerializeField] Color mAddColor = Color.green; [SerializeField] Color mReduceColor = Color.red; [SerializeField] bool mFixLength = true; [SerializeField] bool mUseShort = false; Sequence mPopTweenSequence; Sequence mFadeTweenSequence; private Camera mMainCam; private Camera mUICam; private int mCurrentNum; private int mFinalCount; private Vector2 mChangeOriginalPos; public void Init(Camera pMainCam = null, Camera pUICam = null) { mMainCam = pMainCam; mUICam = pUICam; mChangeOriginalPos = mTxtCurrencyChange.rectTransform.anchoredPosition; } public void RefreshRes(int pCount) { mCurrentNum = pCount; mTxtCurrency.text = mUseShort ? NumForShort(mCurrentNum) : mCurrentNum.ToString(); if (!mFixLength) { mRctBg.sizeDelta = new Vector2(mTxtCurrency.preferredWidth + 124, mRctBg.sizeDelta.y); } DelResRefresh?.Invoke(); } public void FlyRes(Vector3 pWorldPos, int pFlyCount, int pCoinCount, int pFinalCount) { mFinalCount = pFinalCount; float tFlyDelta = 0.02f; for (int i = 0; i < pFlyCount; i++) { FlyOneCoin(pWorldPos, tFlyDelta * i); } PopResChange(pCoinCount); StartCoroutine(SeperatlyAddCoin(tFlyDelta, pFlyCount, pCoinCount)); } public void PopResChange(int pChangedNum) { mTxtCurrencyChange.text = pChangedNum >= 0 ? "+" + pChangedNum.ToString() : pChangedNum.ToString(); Color tColor = pChangedNum > 0 ? mAddColor : mReduceColor; tColor.a = 0; mTxtCurrencyChange.color = tColor; mTxtCurrencyChange.rectTransform.anchoredPosition = mChangeOriginalPos; mTxtCurrencyChange.rectTransform.DOKill(); mPopTweenSequence = DOTween.Sequence(); mPopTweenSequence.Append(mTxtCurrencyChange.rectTransform.DOAnchorPosY(-100, 0.3f).SetEase(Ease.OutBounce)); mPopTweenSequence.AppendInterval(0.8f); mPopTweenSequence.Append(mTxtCurrencyChange.rectTransform.DOAnchorPosY(0, 0.3f).SetEase(Ease.InBounce)); mTxtCurrencyChange.DOKill(); mFadeTweenSequence = DOTween.Sequence(); mFadeTweenSequence.Append(mTxtCurrencyChange.DOFade(1, 0.3f)); mFadeTweenSequence.AppendInterval(0.8f); mFadeTweenSequence.Append(mTxtCurrencyChange.DOFade(0, 0.3f)); mPopTweenSequence.Restart(); mFadeTweenSequence.Restart(); } public void ShowNotEnoughCoin() { mTxtCurrency.color = Color.white; mTxtCurrency.rectTransform.anchoredPosition = new Vector2(32, 0); mTxtCurrency.color = Color.red; mTxtCurrency.rectTransform.DOKill(); mTxtCurrency.rectTransform.DOPunchAnchorPos(new Vector2(0, 15), 0.5f).onComplete = () => { mTxtCurrency.color = Color.white; mTxtCurrency.rectTransform.anchoredPosition = new Vector2(32, 0); }; } private void FlyOneCoin(Vector3 pWorldPos, float pDelay) { Vector2 tStartPos = GetLocalPosInRect(pWorldPos, mRctCurrencyIcon, mMainCam, mUICam); RectTransform tFlyCoin = Instantiate(mTplCurrency).GetComponent(); tFlyCoin.gameObject.SetActive(true); tFlyCoin.SetParent(mRctCurrencyIcon, false); tFlyCoin.localScale = Vector3.one; tFlyCoin.anchoredPosition = tStartPos; Vector3 tJumpPos = tStartPos + new Vector2(UnityEngine.Random.Range(-250f, 250f), UnityEngine.Random.Range(-250f, 250f)); tFlyCoin.DOJumpAnchorPos(tJumpPos, URandom.Range(100, 400), 1, 0.3f); tFlyCoin.DOAnchorPos(Vector2.zero, 0.5f).SetDelay(0.3f + pDelay).SetEase(Ease.Linear).onComplete = () => { Destroy(tFlyCoin.gameObject); }; } private IEnumerator SeperatlyAddCoin(float pFlyDelta, int pFlyCount, int pCoinCount) { int tCoinPerFly = 1, tCoinLastFly = 1; if (pCoinCount > pFlyCount) { tCoinPerFly = pCoinCount / pFlyCount; tCoinLastFly = pCoinCount - tCoinPerFly * pFlyCount; if (tCoinLastFly == 0) tCoinLastFly = tCoinPerFly; } yield return new WaitForSeconds(1f); for (int i = 0; i < pFlyCount; i++) { int tAddCount = i < pFlyCount - 1 ? tCoinPerFly : tCoinLastFly; if (i == pFlyCount - 1) { RefreshRes(mFinalCount); } else { AddCoins(tAddCount); } yield return new WaitForSeconds(pFlyDelta); } } private void AddCoins(int pAddCount) { mCurrentNum += pAddCount; RefreshRes(mCurrentNum); } private void PunchIcon(RectTransform pRect) { pRect.localScale = Vector3.one; pRect.DOKill(); pRect.DOPunchScale(Vector3.one * 1.2f, 0.3f); } private Vector2 GetLocalPosInRect(Vector3 pWorldPos, RectTransform pRect, Camera pMainCam, Camera pUICam = null) { Vector2 tScreenPos = RectTransformUtility.WorldToScreenPoint(pMainCam, pWorldPos); Vector2 tLocalPos = Vector2.zero; RectTransformUtility.ScreenPointToLocalPointInRectangle(pRect, tScreenPos, pUICam, out tLocalPos); return tLocalPos; } const int BILLION = 1000000000; const int MILLION = 1000000; const int THOUSAND = 1000; private string NumForShort(int pNum) { string tNumStr = pNum.ToString(); float tShortNum = 0; if (pNum >= BILLION) { tShortNum = pNum / (float)BILLION; tNumStr = (tShortNum - ((int)tShortNum)) >= 0.1f ? string.Format("{0:F1}B", tShortNum) : string.Format("{0}B", (int)tShortNum); } else if (pNum >= MILLION) { tShortNum = pNum / (float)MILLION; tNumStr = (tShortNum - ((int)tShortNum)) >= 0.1f ? string.Format("{0:F1}M", tShortNum) : string.Format("{0}M", (int)tShortNum); } else if (pNum >= THOUSAND * 10) { tShortNum = pNum / (float)THOUSAND; tNumStr = (tShortNum - ((int)tShortNum)) >= 0.1f ? string.Format("{0:F1}K", tShortNum) : string.Format("{0}K", (int)tShortNum); } return tNumStr; } }