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 _currentRotationCoroutine; [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) { 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(); if (i < count) { image.sprite = _cardCountEnabled; } else { image.sprite = _cardCountDisabled; } childObject.transform.SetParent(_countLayout.transform); RectTransform rectTransform = childObject.GetComponent(); 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 action) { CardArea.SetselectAction(action); } public void SetPrice(int price) { CardPrice = price; PriceText.text = CardPrice.ToString("N0"); PriceUi.SetActive(true); } [Button("회전")] public void Rotation_Start() { Panel.localRotation = Quaternion.Euler(0, -180, 0); Panel.localScale = new Vector3(0, 0, 0); if (_currentRotationCoroutine != null) { StopCoroutine(_currentRotationCoroutine); _currentRotationCoroutine = null; } _currentRotationCoroutine = StartCoroutine(RotateOverTime()); } /// /// 카드를 등장하며 회전시킴! /// /// private IEnumerator RotateOverTime() { BackObject.SetActive(true); _countLayout.SetActive(false); Quaternion startRotation = Panel.localRotation; Quaternion targetRotation = Quaternion.Euler(0, 0, 0); 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; } 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().sprite = _cardCountEnabled; } } } }