using UnityEngine; public class MyPageCardPanelAnimation : MonoBehaviour { public enum State { Start, Move, Color, End } private const float RANDOM_TIMER_RANGE = 0.3f; private const float ORIGINAL_POS_X = -22100f; private const float COLOR_TIME = 0.6f; private const float START_WAIT_TIMER = 0.05f; private static readonly float[] ANGLES_3 = new float[3] { 5f, 0f, -5f }; private static readonly float[] ANGLES_2 = new float[2] { 5f, -5f }; private static readonly float[] ANGLES_1 = new float[1]; private const float CARD_ORIGINAL_POS_X = -1000f; private const float CARD_DELAY_FACTOR = 0.03f; private const float CARD_TIME_MOTION = 0.0001f; private const float CARD_TIME_BASE = 0.2f; private const float CARD_TIME_FACTOR = 0.03f; private const float RANDOM_FACTOR = 5f; private const float ALPHA_FACTOR = 4f; private float ClickRotateTimeTotal; private float ClickRotateTime; private float ClickIndex; private bool _isCutCardMotion; private State _state = State.End; private float _timer; private float[] _randomTimer; private int[] _randomDir; private GameObject[] _cardPanel; private UIPanel[] _panel; private Vector3[] _defaultPosition; public bool IsCardMoving { get { if (!(ClickRotateTime > 0f)) { return _state != State.End; } return true; } } public void SetCardPanelList(GameObject[] list) { _cardPanel = new GameObject[list.Length]; for (int i = 0; i < list.Length; i++) { _cardPanel[i] = list[i]; MyPageCardPanel component = list[i].GetComponent(); if (component != null) { component.Index = i; } } InitRandom(); InitializePanel(); } public void UpdateCardPanelDefaultPosition(Vector3[] newPosition) { _defaultPosition = newPosition; } public void PanelClear() { _panel = null; } private void InitializePanel() { if (_panel == null) { _panel = new UIPanel[_cardPanel.Length]; _defaultPosition = new Vector3[_cardPanel.Length]; for (int i = 0; i < _cardPanel.Length; i++) { GameObject gameObject = _cardPanel[i]; _panel[i] = gameObject.GetComponent(); _defaultPosition[i] = gameObject.transform.localPosition; } } } public void StartCardPanelAnimation(bool isCutCardMotion) { _state = State.Start; _timer = 0f; _isCutCardMotion = isCutCardMotion; for (int i = 0; i < _cardPanel.Length; i++) { GameObject obj = _cardPanel[i]; Vector3 localPosition = obj.transform.transform.localPosition; localPosition.x = -22100f; obj.transform.transform.localPosition = localPosition; iTween.Stop(obj); } } public void SkipMoveAnimation() { _state = State.End; ColorChange(isForceOpacity: true); } private void Update() { if (_panel != null) { UpdateCard(); } } private void UpdateCard() { float[] array = (new float[4][] { null, ANGLES_1, ANGLES_2, ANGLES_3 })[_cardPanel.Length]; if (_panel == null) { return; } switch (_state) { case State.Start: { ClickRotateTime = 0f; _timer += Time.deltaTime; for (int k = 0; k < _cardPanel.Length; k++) { GameObject obj = _cardPanel[k]; Vector3 localPosition = obj.transform.transform.localPosition; localPosition.x = -1000f; localPosition.y = _defaultPosition[k].y; obj.transform.transform.localPosition = localPosition; obj.transform.transform.localEulerAngles = new Vector3(0f, 0f, array[k]); } for (int l = 0; l < _cardPanel.Length; l++) { _panel[l].alpha = 0f; } if (_timer >= 0.05f) { _state++; } break; } case State.Move: { for (int j = 0; j < _cardPanel.Length; j++) { float x = _defaultPosition[j].x; iTween.MoveTo(_cardPanel[j], iTween.Hash("x", x, "time", _isCutCardMotion ? 0.0001f : (0.2f + (float)j * 0.03f), "delay", (float)j * 0.03f, "islocal", true, "easetype", iTween.EaseType.easeOutExpo)); } if (!_isCutCardMotion) { GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_SWITCH_MENU_CARD); } _state++; break; } case State.Color: _timer += Time.deltaTime; ColorChange(); if (_timer >= 0.6f) { ColorChange(isForceOpacity: true); _state++; _timer = 0f; InitRandom(); } break; case State.End: { for (int i = 0; i < _cardPanel.Length; i++) { float num = 0f; if ((float)i == ClickIndex && ClickRotateTime > 0f) { ClickRotateTime -= Time.deltaTime; if (ClickRotateTime < 0f) { ClickRotateTime = 0f; _state = State.End; } float num2 = (ClickRotateTimeTotal - ClickRotateTime) / ClickRotateTimeTotal; num2 -= 1f; num2 = 0f - (num2 * num2 * num2 * num2 - 1f); num = 720f * num2; } _randomTimer[i] += Time.deltaTime; if (_randomTimer[i] >= 0f) { _cardPanel[i].transform.localEulerAngles = new Vector3(0f, num + (float)_randomDir[i] * 5f * Mathf.Sin(_randomTimer[i] / 2f), array[i] + (float)_randomDir[i] * Mathf.Sin(_randomTimer[i])); } } break; } } } public void SetCardPanelAngle() { float[] array = (new float[4][] { null, ANGLES_1, ANGLES_2, ANGLES_3 })[_cardPanel.Length]; for (int i = 0; i < _cardPanel.Length; i++) { _cardPanel[i].transform.transform.localEulerAngles = new Vector3(0f, 0f, array[i]); } } private void ColorChange(bool isForceOpacity = false) { if (_panel == null) { return; } for (int i = 0; i < _cardPanel.Length; i++) { if (_panel[i].alpha < 1f && !isForceOpacity) { float alpha = _panel[i].alpha; alpha += Time.deltaTime * 4f; if (alpha >= 1f) { alpha = 1f; } _panel[i].alpha = alpha; } else { _panel[i].alpha = 1f; } } } public void OnClicked(int i, bool isPlaySe = true) { ClickRotateTimeTotal = 1f; ClickRotateTime = ClickRotateTimeTotal; ClickIndex = i; if (isPlaySe) { GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_MENU_CARD); } } public void StopMove() { _state = State.End; for (int i = 0; i < _cardPanel.Length; i++) { iTween.Stop(_cardPanel[i]); if (_panel != null) { _panel[i].alpha = 1f; } } InitRandom(); ColorChange(isForceOpacity: true); } private void InitRandom() { _randomDir = new int[_cardPanel.Length]; _randomTimer = new float[_cardPanel.Length]; for (int i = 0; i < _cardPanel.Length; i++) { _randomDir[i] = (((double)Random.value > 0.5) ? 1 : (-1)); _randomTimer[i] = Random.Range(-0.3f, 0f); } } }