CapersProject/Assets/02.Scripts/Ui/Tycoon/TycoonCard.cs
2024-12-03 16:54:12 +09:00

336 lines
11 KiB
C#

using System;
using System.Collections;
using BlueWater.Tycoons;
using BlueWater.Utility;
using Sirenix.OdinInspector;
using UnityEngine;
using TMPro;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace BlueWater.Uis
{
public class TycoonCard : MonoBehaviour
{
[field: Title("컴포넌트")]
[field: SerializeField]
public RectTransform RectTransform { get; private set; }
[field: SerializeField]
public Transform Panel { get; private set; }
[field: SerializeField]
public Image CardImage { get; private set; }
[field: SerializeField]
public GameObject BackObject { get; private set; }
[field: SerializeField]
public GameObject PriceUi { get; private set; }
[field: SerializeField]
public TMP_Text PriceText { get; private set; }
[field: SerializeField]
public TycoonCardArea CardArea { get; private set; }
[field: SerializeField]
public GameObject _countLayout;
[field: SerializeField]
private Sprite _cardCountEnabled;
[field: SerializeField]
private Sprite _cardCountDisabled;
[Title("카드 속성")]
[SerializeField]
private TMP_Text _informationText;
internal CardData CardDataForIdx;
//[field: SerializeField, CLabel("IDX"), ReadOnly]
//private string _cardData = "AddAllLiquid";
[field: SerializeField]
private string cardName;
//[field: SerializeField, CLabel("카드 이미지")]
//private Image CardImage;
[field: SerializeField]
private string cardText;
private Coroutine _currentCreateCoroutine;
private Coroutine _currentRotationCoroutine;
[HideInInspector]
public bool checkRotation = false;
private bool checkCreate = false;
[FormerlySerializedAs("RotationDurationCard")]
[field: Title("카드 회전")]
[field: SerializeField]
internal float rotationDurationCard = 1.0f;
[field: SerializeField]
public Acceleration accelerationCard;
[field: Title("부가효과 : 카드 기울기")]
[field: SerializeField]
internal float maxRotationAngle = 15f;
[field: SerializeField]
internal float returnSpeed = 1.0f;
public int CardPrice { get; private set; }
private bool _isPointerInside; // 이미지 안에 마우스가 있는지 여부를 추적
private Coroutine _startRotationCoroutine;
private Coroutine _endRotationCoroutine;
private Coroutine _changedLocaleInstance;
private void OnEnable()
{
LocalizationSettings.SelectedLocaleChanged += OnChangedLocale;
}
private void OnDisable()
{
LocalizationSettings.SelectedLocaleChanged -= OnChangedLocale;
}
private void OnChangedLocale(Locale locale)
{
Utils.StartUniqueCoroutine(this, ref _changedLocaleInstance, ChangeLocaleCoroutine(locale));
StartCoroutine(ChangeLocaleCoroutine(locale));
}
private IEnumerator ChangeLocaleCoroutine(Locale locale)
{
var loadingOperation = Utils.GetTableAsync();
yield return loadingOperation;
if (loadingOperation.Status == AsyncOperationStatus.Succeeded)
{
var table = loadingOperation.Result;
var textValue = table.GetEntry(CardDataForIdx.Idx)?.GetLocalizedString();
_informationText.text = textValue;
}
}
public void SetName(string objectName) => gameObject.name = objectName;
public void SetLocalPosition(Vector3 localPosition) => transform.localPosition = localPosition;
public void SetLocalScale(Vector3 localScale) => transform.localScale = localScale;
//지정된 IDX값으로 정보값 초기화
public void SetCard(CardData cardData)
{
checkCreate = false;
CardDataForIdx = cardData;
int count = TycoonManager.Instance.TycoonCardController.GetSelectedCardCount(CardDataForIdx.Idx);
_informationText.text = Utils.GetLocalizedString(cardData.Idx);
CardImage.sprite = CardDataForIdx.Sprite;
for(int i = 0 ; i < CardDataForIdx.Max ; i ++)
{
GameObject childObject = new GameObject(i.ToString());
Image image = childObject.AddComponent<Image>();
if (i < count)
{
image.sprite = _cardCountEnabled;
}
else
{
image.sprite = _cardCountDisabled;
}
childObject.transform.SetParent(_countLayout.transform);
RectTransform rectTransform = childObject.GetComponent<RectTransform>();
rectTransform.sizeDelta = new Vector2(30, 30);
rectTransform.localScale = new Vector3(1.0f,1.0f,1.0f);
rectTransform.localRotation = new Quaternion(0.0f,0.0f,0.0f,0.0f);
rectTransform.localPosition = new Vector3(0.0f,0.0f,0.0f);
}
}
public void SetSelectAction(Action<TycoonCard> action)
{
CardArea.SetselectAction(action);
}
public void SetPrice(int price)
{
CardPrice = price;
PriceText.text = CardPrice.ToString("N0");
PriceUi.SetActive(true);
}
[Button("등장")]
public void Create_Start()
{
Panel.localRotation = Quaternion.Euler(0, 0, 0);
Panel.localScale = new Vector3(0, 0, 0);
checkRotation = false;
if (_currentCreateCoroutine != null)
{
StopCoroutine(_currentCreateCoroutine);
_currentCreateCoroutine = null;
}
if (_currentRotationCoroutine != null)
{
StopCoroutine(_currentRotationCoroutine);
_currentRotationCoroutine = null;
}
_currentCreateCoroutine = StartCoroutine(CreateOverTime());
}
/// <summary>
/// 카드를 등장시킴
/// </summary>
/// <returns></returns>
private IEnumerator CreateOverTime()
{
BackObject.SetActive(true);
_countLayout.SetActive(false);
Vector3 initialScale = Panel.localScale;
//확대 시작
float elapsedTime = 0.0f;
while (elapsedTime < 0.5f)
{
elapsedTime += Time.unscaledDeltaTime;
float t = elapsedTime / 0.5f;
float easedT = EaseEffect.BounceOut(t);
Panel.localScale = Vector3.Lerp(initialScale, new Vector3(0.95f, 0.95f, 0.95f), easedT);
yield return null;
}
checkCreate = true;
if (checkRotation)
{
_currentRotationCoroutine = StartCoroutine(RotateOverTime());
}
elapsedTime = 0.0f;
while (elapsedTime < rotationDurationCard)
{
elapsedTime += Time.unscaledDeltaTime;
if (elapsedTime > rotationDurationCard / 1.8)
{
CardArea.SetEnable(true);
}
yield return null;
}
}
[Button("회전")]
public void Rotation_Start()
{
if (checkRotation) return;
Panel.localRotation = Quaternion.Euler(0, -180, 0);
checkRotation = true;
if (_currentCreateCoroutine != null)
{
StopCoroutine(_currentCreateCoroutine);
_currentCreateCoroutine = null;
}
if (_currentRotationCoroutine != null)
{
StopCoroutine(_currentRotationCoroutine);
_currentRotationCoroutine = null;
}
if (checkCreate == false)
{
Panel.localScale = new Vector3(0, 0, 0);
_currentRotationCoroutine = StartCoroutine(CreateOverTime());
}
else
{
_currentRotationCoroutine = StartCoroutine(RotateOverTime());
}
}
/// <summary>
/// 카드를 회전시킴!
/// </summary>
/// <returns></returns>
private IEnumerator RotateOverTime()
{
BackObject.SetActive(true);
_countLayout.SetActive(false);
Quaternion startRotation = Panel.localRotation;
Quaternion targetRotation = Quaternion.Euler(0, 0, 0);
Panel.localScale = new Vector3(0.95f, 0.95f, 0.95f);
//회전 시작
float elapsedTime = 0.0f;
while (elapsedTime < rotationDurationCard)
{
elapsedTime += Time.unscaledDeltaTime;
float t = elapsedTime / rotationDurationCard;
float easedT = t;
if (accelerationCard == Acceleration.EaseExpoIn) easedT = Mathf.Pow(2, 10 * (t - 1));
else if (accelerationCard == Acceleration.EaseExpoOut) easedT = 1 - Mathf.Pow(2, -10 * t);
else if (accelerationCard == Acceleration.EaseBounceIn) easedT = 1 - EaseEffect.BounceOut(1 - t);
else if (accelerationCard == Acceleration.EaseBounceOut) easedT = EaseEffect.BounceOut(t);
Panel.localRotation = Quaternion.Lerp(startRotation, targetRotation, easedT);
float currentYRotation = Panel.localRotation.eulerAngles.y;
if (currentYRotation <= 90.0f && BackObject.activeSelf)
{
BackObject.SetActive(false);
_countLayout.SetActive(true);
}
if (elapsedTime > rotationDurationCard / 1.8)
{
CardArea.SetEnable(true);
}
yield return null;
}
Panel.localRotation = targetRotation;
}
public void CardCountUp()
{
if (CardDataForIdx.Max != 0)
{
int count = TycoonManager.Instance.TycoonCardController.GetSelectedCardCount(CardDataForIdx.Idx);
var image = _countLayout.transform.Find(count.ToString());
image.GetComponent<Image>().sprite = _cardCountEnabled;
}
}
}
}