using System.Collections; using BlueWater.Tycoons; using Sirenix.OdinInspector; using UnityEngine; using Random = UnityEngine.Random; namespace BlueWater.Uis { public class TycoonSelectCard : PopupUi { private GameObject _panel; private Camera uiCamera; [field: SerializeField, CLabel("카드 1")] private GameObject card01; [field: SerializeField, CLabel("카드 2")] private GameObject card02; [field: SerializeField, CLabel("카드 3")] private GameObject card03; private GameObject _currentCard01; private GameObject _currentCard02; private GameObject _currentCard03; private TycoonCard _tycoonCard01Componet; private TycoonCard _tycoonCard02Componet; private TycoonCard _tycoonCard03Componet; private LevelData _lvData; private TycoonManager _tycoonManager; private TycoonStatus _tycoonStatus; [field: SerializeField, CLabel("업그레이드_스크립트")] private GameObject _upgradePopup; private void Awake() { EventManager.OnLevelUp += CreateCardEvent; _panel = transform.Find("Panel").gameObject; HideUi(); } void Start() { uiCamera = TycoonCameraManager.Instance.UiCamera; _tycoonManager = TycoonManager.Instance; _tycoonStatus = _tycoonManager.TycoonStatus; } private void OnDestroy() { EventManager.OnLevelUp -= CreateCardEvent; } public override void Open() { VisualFeedbackManager.Instance.SetBaseTimeScale(0.0f); PlayerInputKeyManager.Instance.DisableAction("Manual"); PopupUiController.RegisterPopup(this); ShowUi(); IsOpened = true; } public override void Close() { HideUi(); PlayerInputKeyManager.Instance.EnableAction("Manual"); PopupUiController.UnregisterPopup(this); IsOpened = false; if (!PopupUiController.IsPopupListEmpty()) return; VisualFeedbackManager.Instance.ResetTimeScale(); } [Button("카드 생성하기(레벨업)")] private void CreateCard() { if (!Application.isPlaying) return; // 기존 카드가 있으면 삭제 if (_currentCard01 != null) { Destroy(_currentCard01); } if (_currentCard02 != null) { Destroy(_currentCard02); } if (_currentCard03 != null) { Destroy(_currentCard03); } _currentCard01 = Instantiate(card01, _panel.transform); _currentCard01.name = "Card01"; _currentCard02 = Instantiate(card02, _panel.transform); _currentCard02.name = "Card02"; _currentCard03 = Instantiate(card03, _panel.transform); _currentCard03.name = "Card03"; _currentCard01.transform.localPosition = new Vector3(-550, 0, 0); _currentCard02.transform.localPosition = new Vector3(0, 0, 0); _currentCard03.transform.localPosition = new Vector3(550, 0, 0); _tycoonCard01Componet = _currentCard01.GetComponent(); _tycoonCard02Componet = _currentCard02.GetComponent(); _tycoonCard03Componet = _currentCard03.GetComponent(); Open(); //----카드 값 지정 및 초기화---- CardData card; var card01Key = "NULL VAL"; do { card = _tycoonManager.CardDataSo.GetRandCardData(); card = _tycoonManager.CardDataSo.SubstitutionLiquid(card, _lvData); if (card != null) { card01Key = card.Idx; } } while (card == null || _tycoonManager.CardDataSo.CardMaxCheck(card)); _tycoonCard01Componet.SetCard(card01Key); var card02Key = "NULL VAL"; do { card = _tycoonManager.CardDataSo.GetRandCardData(); card = _tycoonManager.CardDataSo.SubstitutionLiquid(card, _lvData); if (card != null) { card02Key = card.Idx; } } while (card == null || _tycoonManager.CardDataSo.CardMaxCheck(card) || card02Key.Equals(card01Key)); _tycoonCard02Componet.SetCard(card02Key); var card03Key = "NULL VAL"; do { card = _tycoonManager.CardDataSo.GetRandCardData(); card = _tycoonManager.CardDataSo.SubstitutionLiquid(card, _lvData); if (card != null) { card03Key = card.Idx; } } while (card == null || _tycoonManager.CardDataSo.CardMaxCheck(card) || card03Key.Equals(card01Key) || card03Key.Equals(card02Key)); _tycoonCard03Componet.SetCard(card03Key); //------------- _tycoonCard01Componet.Rotation_Start(); _tycoonCard02Componet.Rotation_Start(); _tycoonCard03Componet.Rotation_Start(); } private void CreateCardEvent(LevelData levelData) { _lvData = levelData; if (_lvData.Idx == "1") return; CreateCard(); } public void SelectedCard(TycoonCard currTycoonCard) { switch (currTycoonCard.CardDataForIdx.Idx) //탐색 후 행동... { case "HeartSlotPlus": _tycoonStatus.MaxPlayerHealth += 2; break; case "HeartRecovery": _tycoonStatus.CurrentPlayerHealth += 2; break; case "FullHeartRecovery": _tycoonStatus.CurrentPlayerHealth = _tycoonStatus.MaxPlayerHealth; break; case "AddLiquidB": _tycoonStatus.CurrentLiquidAmountB += 4000; break; case "AddLiquidC": _tycoonStatus.CurrentLiquidAmountC += 4000; break; case "AddLiquidD": _tycoonStatus.CurrentLiquidAmountD += 4000; break; case "AddLiquidE": _tycoonStatus.CurrentLiquidAmountE += 4000; break; case "AddGarnish1": _tycoonStatus.CurrentGarnishAmount1 += 4000; break; case "AddGarnish2": _tycoonStatus.CurrentGarnishAmount2 += 4000; break; case "AllLiquidAdd": EventManager.InvokeAddBarrels(1000); break; case "ServerNpcAdd": EventManager.InvokeCreateServerCrew(); break; case "CleanerNpcAdd": EventManager.InvokeCreateCleanerCrew(); break; case "BartenderNpcAdd": EventManager.InvokeCreateBartenderCrew(); break; case "SpeedBoost": _tycoonStatus.PlayerMoveSpeedMultiplier += 0.1f; break; case "ExpBoost": _tycoonStatus.ExpMultiplier += 0.2f; break; case "GoldBoost": _tycoonStatus.GoldMultiplier += 0.2f; break; case "AllCleanUp": EventManager.InvokeCleaningAll(); break; case "GaugeReset": EventManager.InvokeGaugeResetCustomers(); break; case "DashCooldownReduction": _tycoonStatus.PlayerDashCooldownReduction += 1; break; case "TipBoost": // TODO : 서빙, 청소 팁 계산 및 연출 _tycoonStatus.TipMultiplier += 0.2f; break; case "EndGoldBoost": _tycoonStatus.EndGoldMultiplier += 0.1f; break; case "AllCustomerPurification": break; case "GaugeTimeUp": _tycoonStatus.CustomerHurryTimeIncrease += 3; break; case "BarrelAutoSupply": if (_tycoonManager.CardDataSo.CardFirstCheck("BarrelAutoSupply")) { EventManager.InvokeAutoSupplyBarrels(); } _tycoonStatus.BarrelAutoIncrease += 5; break; case "ServerNpcUpgrade": // TODO : 서빙 팁 계산 및 연출 _tycoonStatus.ServerTipMultiplier += 0.1f; break; case "CleanerNpcUpgrade": _tycoonStatus.CleanerCleaningReduction += 1; break; case "BartenderNpcUpgrade": _tycoonStatus.BartenderMakingReduction += 1; break; case "DoubleServing": break; case "RandomChange": break; case "GoldAutoGain": break; case "PassiveMakingBonus": break; case "PassiveServingBonus": break; case "PassiveCleaningBonus": break; default: Debug.Log("Not Found Card : IDX" + currTycoonCard.CardDataForIdx.Idx); return; } TycoonManager.Instance.CardDataSo.AddToSelectedCard(currTycoonCard.CardDataForIdx); StartCoroutine(SelectedAnimation(currTycoonCard)); } // ReSharper disable Unity.PerformanceAnalysis private IEnumerator SelectedAnimation(TycoonCard currTycoonCard) { Vector2 startPosition01; //시작 위치 Vector2 endPosition01; // 목표 위치 Vector2 startPosition02; //시작 위치 Vector2 endPosition02; // 목표 위치 Vector2 startPosition03; //시작 위치 Vector2 endPosition03; //목표 위치 RectTransform rect01; RectTransform rect02; RectTransform rect03; rect03 = currTycoonCard.GetComponent(); startPosition03 = rect03.anchoredPosition; endPosition03 = new Vector2(0.0f, 0.0f); // 화면의 해상도를 가져옴 if (currTycoonCard == _tycoonCard01Componet) //우우 { rect01 = _tycoonCard02Componet.GetComponent(); startPosition01 = rect01.anchoredPosition; // 시작 위치 endPosition01 = new Vector2(Screen.width + 1500, startPosition01.y); // 목표 위치(좌측) rect02 = _tycoonCard03Componet.GetComponent(); startPosition02 = rect02.anchoredPosition; // 시작 위치 endPosition02 = new Vector2(Screen.width + 1500, startPosition02.y); // 목표 위치(좌측) } else if (currTycoonCard == _tycoonCard02Componet) //좌우 { rect01 = _tycoonCard01Componet.GetComponent(); startPosition01 = rect01.anchoredPosition; // 시작 위치 endPosition01 = new Vector2(-1500, startPosition01.y); // 목표 위치(좌측) rect02 = _tycoonCard03Componet.GetComponent(); startPosition02 = rect02.anchoredPosition; // 시작 위치 endPosition02 = new Vector2(Screen.width + 1500, startPosition02.y); // 목표 위치(좌측) } else //좌좌 { rect01 = _tycoonCard01Componet.GetComponent(); startPosition01 = rect01.anchoredPosition; // 시작 위치 endPosition01 = new Vector2(-1500, startPosition01.y); // 목표 위치(좌측) rect02 = _tycoonCard02Componet.GetComponent(); 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; } if (_currentCard01 != null) { Destroy(_currentCard01); } if (_currentCard02 != null) { Destroy(_currentCard02); } if (_currentCard03 != null) { Destroy(_currentCard03); } if (int.Parse(_lvData.Idx) % 5 == 0) { EventManager.InvokeUpgradeUi(_lvData); } Close(); } public void ShowUi() => _panel.SetActive(true); public void HideUi() => _panel.SetActive(false); } }