153 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			153 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using System.Collections;
							 | 
						|||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						|||
| 
								 | 
							
								using UnityEngine;
							 | 
						|||
| 
								 | 
							
								using UnityEngine.UI;
							 | 
						|||
| 
								 | 
							
								using DG.Tweening;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								public class ResShower : MonoBehaviour
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    [SerializeField] GameObject mTplCurrency;
							 | 
						|||
| 
								 | 
							
								    [SerializeField] RectTransform mRctCurrencyIcon;
							 | 
						|||
| 
								 | 
							
								    [SerializeField] Text mTxtCurrency;
							 | 
						|||
| 
								 | 
							
								    [SerializeField] Text mTxtCurrencyChange;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    Sequence mPopTweenSequence;
							 | 
						|||
| 
								 | 
							
								    Sequence mFadeTweenSequence;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    private Camera mMainCam;
							 | 
						|||
| 
								 | 
							
								    private Camera mUICam;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    private int mFinalCount;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public void SetCamera(Camera pMainCam, Camera pUICam = null)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        mMainCam = pMainCam;
							 | 
						|||
| 
								 | 
							
								        mUICam = pUICam;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public void FlyCoins(Vector3 pWorldPos, int pFlyCount, int pCoinCount, int pFinalCount)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        mFinalCount = pFinalCount;
							 | 
						|||
| 
								 | 
							
								        float tFlyDelta = 0.05f;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        for (int i = 0; i < pFlyCount; i++)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            FlyOneCoin(pWorldPos, tFlyDelta * i);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        PopCoinChange(pCoinCount);
							 | 
						|||
| 
								 | 
							
								        StartCoroutine(SeperatlyAddCoin(tFlyDelta, pFlyCount, pCoinCount));
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    private void FlyOneCoin(Vector3 pWorldPos, float pDelay)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        Vector2 tStartPos = GetLocalPosInRect(pWorldPos, mRctCurrencyIcon, mMainCam, mUICam);
							 | 
						|||
| 
								 | 
							
								        RectTransform tFlyCoin = Instantiate<GameObject>(mTplCurrency).GetComponent<RectTransform>();
							 | 
						|||
| 
								 | 
							
								        tFlyCoin.gameObject.SetActive(true);
							 | 
						|||
| 
								 | 
							
								        tFlyCoin.SetParent(mRctCurrencyIcon, false);
							 | 
						|||
| 
								 | 
							
								        tFlyCoin.localScale = Vector3.one;
							 | 
						|||
| 
								 | 
							
								        tFlyCoin.anchoredPosition = tStartPos;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        Vector3 tJumpPos = tStartPos + new Vector2(UnityEngine.Random.Range(-150f, 150f), UnityEngine.Random.Range(-80f, -120f));
							 | 
						|||
| 
								 | 
							
								        tFlyCoin.DOJumpAnchorPos(tJumpPos, 300, 1, 0.5f);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        tFlyCoin.DOAnchorPos(Vector2.zero, 0.5f).SetDelay(0.5f + 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;
							 | 
						|||
| 
								 | 
							
								            RefreshCoins(tAddCount);
							 | 
						|||
| 
								 | 
							
								            if (i == pFlyCount - 1)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                RefreshCoinsWithoutAni();
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            yield return new WaitForSeconds(pFlyDelta);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public void RefreshCoins(int pAddCount)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        int tCurrentNum = int.Parse(mTxtCurrency.text);
							 | 
						|||
| 
								 | 
							
								        tCurrentNum += pAddCount;
							 | 
						|||
| 
								 | 
							
								        mTxtCurrency.text = tCurrentNum.ToString();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public void RefreshCoinsWithoutAni()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        mTxtCurrency.text = mFinalCount.ToString();
							 | 
						|||
| 
								 | 
							
								        //mRectCoinIcon.anchoredPosition = new Vector2(-(mTxtCoin.preferredWidth), mRectCoinIcon.anchoredPosition.y);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public void PopCoinChange(int pChangedNum)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        mTxtCurrencyChange.text = pChangedNum >= 0 ? "+" + pChangedNum.ToString() : pChangedNum.ToString();
							 | 
						|||
| 
								 | 
							
								        Color tColor = pChangedNum > 0 ? Color.green : Color.red;
							 | 
						|||
| 
								 | 
							
								        tColor.a = 0;
							 | 
						|||
| 
								 | 
							
								        mTxtCurrencyChange.color = tColor;
							 | 
						|||
| 
								 | 
							
								        mTxtCurrencyChange.rectTransform.anchoredPosition = new Vector2(32, 0);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        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();
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    private void PunchIcon(RectTransform pRect)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        pRect.localScale = Vector3.one;
							 | 
						|||
| 
								 | 
							
								        pRect.DOKill();
							 | 
						|||
| 
								 | 
							
								        pRect.DOPunchScale(Vector3.one * 1.2f, 0.3f);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    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);
							 | 
						|||
| 
								 | 
							
								        };
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public 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;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |