using System.Collections; using System.Collections.Generic; using BlueWater.Tycoons; using Sirenix.OdinInspector; using UnityEngine; using Random = UnityEngine.Random; namespace BlueWater.Uis { public class TycoonSelectCard : PopupUi { [SerializeField] private GameObject _panel; [SerializeField] private Transform _contents; private List _tycoonCards = new(3); private LevelData _currentLevelData; private TycoonManager _tycoonManager; private TycoonCardController _tycoonCardController; private void Start() { _panel.SetActive(false); _tycoonManager = TycoonManager.Instance; _tycoonCardController = _tycoonManager.TycoonCardController; EventManager.OnOpenedNormalRewardBox += CreateCard; } private void OnDestroy() { EventManager.OnOpenedNormalRewardBox -= CreateCard; } public override void Open() { PlayerInputKeyManager.Instance.DisableAction("OpenManualBook"); VisualFeedbackManager.Instance.SetBaseTimeScale(0.0f); PlayerInputKeyManager.Instance.SwitchCurrentActionMap(InputActionMaps.TycoonUi); PopupUiController.RegisterPopup(this); _panel.SetActive(true); IsOpened = true; } public override void Close() { _panel.SetActive(false); PopupUiController.UnregisterPopup(this); PlayerInputKeyManager.Instance.SwitchCurrentActionMap(InputActionMaps.Tycoon); IsOpened = false; VisualFeedbackManager.Instance.ResetTimeScale(); PlayerInputKeyManager.Instance.EnableAction("OpenManualBook"); } [Button("카드 생성하기(레벨업)")] private void CreateCard() { if (!Application.isPlaying) return; _currentLevelData = TycoonManager.Instance.GetCurrentLevelData(); _tycoonCardController.DestroyCardList(_tycoonCards); for (int i = 0; i < _tycoonCards.Capacity; i++) { var newCard = _tycoonCardController.CreateTycoonCard(_contents); newCard.SetName($"Card{i:00}"); _tycoonCards.Add(newCard); } Open(); //----카드 값 지정 및 초기화---- HashSet hashSet = new HashSet(_tycoonCards.Capacity - 1); foreach (var element in _tycoonCards) { CardData cardData = null; string cardIdx = null; do { cardData = _tycoonManager.CardDataSo.GetRandCardData(); cardData = _tycoonManager.CardDataSo.SubstitutionLiquid(cardData, _currentLevelData); if (cardData != null) { cardIdx = cardData.Idx; } } while (cardData == null || _tycoonManager.CardDataSo.CardMaxCheck(cardData) || hashSet.Contains(cardIdx) || _tycoonCardController.IsSelectedPassiveCard(cardData)); hashSet.Add(cardIdx); element.SetCard(cardData); element.SetSelectAction(SelectedCard); element.Rotation_Start(); } } private void SelectedCard(TycoonCard currentTycoonCard) { _tycoonCardController.SelectedCard(currentTycoonCard); currentTycoonCard.CardArea.SuccessClick(); StartCoroutine(SelectedAnimation(currentTycoonCard)); } // ReSharper disable Unity.PerformanceAnalysis private IEnumerator SelectedAnimation(TycoonCard currentTycoonCard) { Vector2 startPosition01 = default; //시작 위치 Vector2 endPosition01 = default; // 목표 위치 Vector2 startPosition02 = default; //시작 위치 Vector2 endPosition02 = default; // 목표 위치 Vector2 startPosition03 = default; //시작 위치 Vector2 endPosition03 = default; //목표 위치 RectTransform rect01 = null; RectTransform rect02 = null; RectTransform rect03 = null; rect03 = currentTycoonCard.GetComponent(); startPosition03 = rect03.anchoredPosition; endPosition03 = new Vector2(0.0f, 0.0f); // 화면의 해상도를 가져옴 if (currentTycoonCard == _tycoonCards[0]) //우우 { rect01 = _tycoonCards[0].RectTransform; startPosition01 = rect01.anchoredPosition; // 시작 위치 endPosition01 = new Vector2(Screen.width + 1500, startPosition01.y); // 목표 위치(좌측) rect02 = _tycoonCards[2].RectTransform; startPosition02 = rect02.anchoredPosition; // 시작 위치 endPosition02 = new Vector2(Screen.width + 1500, startPosition02.y); // 목표 위치(좌측) } else if (currentTycoonCard == _tycoonCards[1]) //좌우 { rect01 = _tycoonCards[1].RectTransform; startPosition01 = rect01.anchoredPosition; // 시작 위치 endPosition01 = new Vector2(-1500, startPosition01.y); // 목표 위치(좌측) rect02 = _tycoonCards[2].RectTransform; startPosition02 = rect02.anchoredPosition; // 시작 위치 endPosition02 = new Vector2(Screen.width + 1500, startPosition02.y); // 목표 위치(좌측) } else if (currentTycoonCard == _tycoonCards[2]) //좌좌 { rect01 = _tycoonCards[0].RectTransform; startPosition01 = rect01.anchoredPosition; // 시작 위치 endPosition01 = new Vector2(-1500, startPosition01.y); // 목표 위치(좌측) rect02 = _tycoonCards[1].RectTransform; startPosition02 = rect02.anchoredPosition; // 시작 위치 endPosition02 = new Vector2(-1500, startPosition02.y); // 목표 위치(좌측) } float time = 0.0f; // 타이머 초기화 int rotationDirection = Random.Range(0, 2) * 2 - 1; // 결과는 -1 또는 1 while (time < 1.0f) { time += Time.unscaledDeltaTime; // 시간 업데이트 float t = EaseEffect.ExpoOut((time / 1.0f)); // 정규화된 시간 //캐릭터의 위치 반환 (실시간으로 움직이기 때문에... 계속 업데이트하면서 가져오기.) // 위치 업데이트 rect01.anchoredPosition = Vector2.Lerp(startPosition01, endPosition01, t); rect02.anchoredPosition = Vector2.Lerp(startPosition02, endPosition02, t); // 선형 보간을 사용하여 위치와 크기 조정 rect03.anchoredPosition = Vector2.Lerp(startPosition03, endPosition03, EaseEffect.ExpoOut((time / 1.0f) + 1.0f)); // 정규화된 시간 rect03.localScale = Vector3.Lerp(Vector3.one, Vector3.zero, t); // 포물선 효과 추가 float height = Mathf.Sin(Mathf.PI * t) * 500f; // 높이 float width = Mathf.Sin(Mathf.PI * t) * 200f * rotationDirection; // 폭 rect03.anchoredPosition += new Vector2(width, height); // Z축 회전 추가 float rotationAngle = 15f * rotationDirection * t; // 최대 15도 회전 rect03.rotation = Quaternion.Euler(new Vector3(0, 0, rotationAngle)); yield return null; } _tycoonCardController.DestroyCardList(_tycoonCards); Close(); } } }