CapersProject/Assets/02.Scripts/Ui/Tycoon/TycoonRareRewardBoxUi.cs

188 lines
6.6 KiB
C#
Raw Normal View History

2024-11-17 04:29:57 +00:00
using System.Collections.Generic;
2024-11-17 15:36:08 +00:00
using BlueWater.Audios;
2024-11-17 04:29:57 +00:00
using BlueWater.Tycoons;
using UnityEngine;
using Sirenix.OdinInspector;
2024-12-03 09:38:19 +00:00
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
2024-11-26 08:18:41 +00:00
using UnityEngine.UI;
2024-12-03 07:54:12 +00:00
using Random = UnityEngine.Random;
2024-11-17 04:29:57 +00:00
namespace BlueWater.Uis
{
public class TycoonRareRewardBoxUi : PopupUi
{
[SerializeField]
private GameObject _panel;
[SerializeField]
private Transform _contents;
[SerializeField]
2024-11-26 08:18:41 +00:00
private Vector3 _cardLocalScale_2 = new(0.9f, 0.9f, 1f);
private Vector3 _cardLocalScale_3 = new(0.8f, 0.8f, 1f);
private Vector3 _cardLocalScale_4 = new(0.7f, 0.7f, 1f);
private Vector3 _cardLocalScale_5 = new(0.65f, 0.65f, 1f);
2024-11-17 04:29:57 +00:00
2024-11-17 15:36:08 +00:00
[SerializeField]
private string _openSfxName = "RareRewardBox";
2024-11-26 08:18:41 +00:00
2024-12-03 09:38:19 +00:00
[SerializeField]
private Button allOpenCardButton;
[SerializeField]
private Button closeButton;
2024-11-17 04:29:57 +00:00
private List<TycoonCard> _tycoonCards = new(5);
2024-12-03 07:54:12 +00:00
private int viewCardCount = 0;
2024-11-17 04:29:57 +00:00
private LevelData _currentLevelData;
private TycoonManager _tycoonManager;
private TycoonCardController _tycoonCardController;
2024-12-03 09:38:19 +00:00
private InputAction _interactionEAction;
2024-12-03 07:54:12 +00:00
2024-11-17 04:29:57 +00:00
private void Start()
{
2024-12-03 09:38:19 +00:00
_interactionEAction = PlayerInputKeyManager.Instance.GetAction(InputActionMaps.TycoonUi, TycoonUiActions.InteractionE);
2024-11-17 04:29:57 +00:00
_panel.SetActive(false);
_tycoonManager = TycoonManager.Instance;
_tycoonCardController = _tycoonManager.TycoonCardController;
EventManager.OnOpenedRareRewardBox += CreateCard;
}
private void OnDestroy()
{
EventManager.OnOpenedRareRewardBox -= CreateCard;
2024-12-03 09:38:19 +00:00
_interactionEAction = null;
2024-11-17 04:29:57 +00:00
}
public override void Open()
{
VisualFeedbackManager.Instance.SetBaseTimeScale(0.0f);
2024-11-28 23:07:50 +00:00
AudioManager.Instance.PlaySfx(_openSfxName, ignoreTimeScale: true);
2024-11-17 04:29:57 +00:00
PlayerInputKeyManager.Instance.SwitchCurrentActionMap(InputActionMaps.TycoonUi);
PopupUiController.RegisterPopup(this);
_panel.SetActive(true);
IsOpened = true;
2024-12-03 07:54:12 +00:00
allOpenCardButton.gameObject.SetActive(true);
closeButton.gameObject.SetActive(false);
2024-11-17 04:29:57 +00:00
}
public override void Close()
{
_panel.SetActive(false);
PopupUiController.UnregisterPopup(this);
PlayerInputKeyManager.Instance.SwitchCurrentActionMap(InputActionMaps.Tycoon);
IsOpened = false;
VisualFeedbackManager.Instance.ResetTimeScale();
}
2024-12-03 09:38:19 +00:00
public override void EnableInput()
{
_interactionEAction.performed += OnInteractionE;
}
public override void DisableInput()
{
_interactionEAction.performed -= OnInteractionE;
}
2024-11-17 04:29:57 +00:00
[Button("레어 상자 열기")]
private void CreateCard()
{
if (!Application.isPlaying) return;
2024-12-03 07:54:12 +00:00
viewCardCount = 0;
2024-11-17 04:29:57 +00:00
_currentLevelData = TycoonManager.Instance.GetCurrentLevelData();
_tycoonCardController.DestroyCardList(_tycoonCards);
var randomCount = Random.Range(2, 6);
2024-12-03 07:54:12 +00:00
2024-11-26 08:18:41 +00:00
_contents.GetComponent<HorizontalLayoutGroup>().spacing = randomCount * 10;
2024-11-17 04:29:57 +00:00
for (int i = 0; i < randomCount; i++)
{
var newCard = _tycoonCardController.CreateTycoonCard(_contents);
newCard.SetName($"Card{i:00}");
2024-12-03 07:54:12 +00:00
newCard.CardArea.SetselectAction(OpenCard);
2024-11-26 08:18:41 +00:00
switch (randomCount)
{
case 2: newCard.SetLocalScale(_cardLocalScale_2); break;
case 3: newCard.SetLocalScale(_cardLocalScale_3); break;
case 4: newCard.SetLocalScale(_cardLocalScale_4); break;
case 5: newCard.SetLocalScale(_cardLocalScale_5); break;
default: newCard.SetLocalScale(_cardLocalScale_5); break;
}
2024-12-03 07:54:12 +00:00
viewCardCount++;
2024-11-17 04:29:57 +00:00
_tycoonCards.Add(newCard);
}
Open();
//----카드 값 지정 및 초기화----
HashSet<string> hashSet = new HashSet<string>(randomCount - 1);
foreach (var element in _tycoonCards)
{
2024-11-28 23:07:50 +00:00
CardRareData cardRareData = null;
2024-11-17 04:29:57 +00:00
CardData cardData = null;
string cardIdx = null;
do
{
2024-11-28 23:07:50 +00:00
cardRareData = _tycoonCardController.CardRareDataSo.GetRandomCardData();
cardIdx = cardRareData.Idx;
cardRareData = _tycoonCardController.CardRareDataSo.SubstitutionLiquid(cardRareData, _currentLevelData);
cardData = _tycoonCardController.CardDataSo.GetDataByIdx(cardIdx);
} while (cardRareData == null || _tycoonCardController.CardMaxCheck(cardData) || hashSet.Contains(cardIdx));
2024-11-17 04:29:57 +00:00
hashSet.Add(cardIdx);
element.SetCard(cardData);
2024-12-03 07:54:12 +00:00
element.Create_Start();
2024-11-26 08:18:41 +00:00
2024-11-28 23:07:50 +00:00
_tycoonCardController.SelectCard(element);
2024-11-17 04:29:57 +00:00
}
}
2024-12-03 07:54:12 +00:00
private void OpenCard(TycoonCard tycoonCard)
{
tycoonCard.Rotation_Start();
tycoonCard.SetSelectAction(null);
viewCardCount--;
if (viewCardCount > 0) return;
allOpenCardButton.gameObject.SetActive(false);
closeButton.gameObject.SetActive(true);
2024-12-03 09:38:19 +00:00
EventSystem.current.SetSelectedGameObject(closeButton.gameObject);
2024-12-03 07:54:12 +00:00
}
[Button("카드 모두 열기")]
public void AllOpenCard()
{
viewCardCount = 0;
//남은 카드가 열리는 연출만 추가하자
foreach (var element in _tycoonCards)
{
element.SetSelectAction(null);
element.Rotation_Start();
}
allOpenCardButton.gameObject.SetActive(false);
closeButton.gameObject.SetActive(true);
2024-12-03 09:38:19 +00:00
EventSystem.current.SetSelectedGameObject(closeButton.gameObject);
}
public void OnInteractionE(InputAction.CallbackContext context)
{
var current = EventSystem.current.currentSelectedGameObject;
if (!current) return;
var currenButton = current.GetComponent<Button>();
currenButton?.onClick?.Invoke();
2024-12-03 07:54:12 +00:00
}
2024-11-17 04:29:57 +00:00
}
}