CapersProject/Assets/02.Scripts/Ui/Tycoon/TycoonSelectCard.cs
2024-11-17 13:29:57 +09:00

197 lines
8.0 KiB
C#

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<TycoonCard> _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<string> hashSet = new HashSet<string>(_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<RectTransform>();
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();
}
}
}