CapersProject/Assets/02.Scripts/BlueWater/Ui/Tycoon/TycoonTutorialPopupUi.cs
2025-02-10 11:13:46 +09:00

173 lines
5.8 KiB
C#

using System;
using System.Collections;
using DDD.Utility;
using DDD.Uis;
using Sirenix.OdinInspector;
using TMPro;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
namespace DDD
{
public class TycoonTutorialPopupUi : PopupUi
{
[field: SerializeField]
public Image PopupImage { get; private set; }
[field: SerializeField]
public CanvasGroup CanvasGroup { get; private set; }
[SerializeField]
private TMP_Text _titleText;
[SerializeField]
private RectTransform _descriptionTextRect;
[SerializeField]
private TMP_Text _descriptionText;
[SerializeField]
private RectTransform _descriptionTImageRect;
[SerializeField]
private Image _descriptionImage;
[SerializeField]
private TMP_Text _pageText;
[SerializeField]
private Button _previousButton;
[SerializeField]
private Button _nextButton;
[Title("연출")]
[SerializeField]
private Vector3 _descriptionTextAnchorPositionInFirst = new(0f, -37f, 0f);
[SerializeField]
private Vector3 _descriptionTextAnchorPositionExceptFirst = new(0f, -280f, 0f);
[SerializeField]
private Vector3 _descriptionImageAnchorPositionInFirst = new(0f, -210f, 0f);
[SerializeField]
private Vector3 _descriptionImageAnchorPositionExceptFirst = new(0f, -150f, 0f);
private TutorialInfo _tutorialInfo;
private TutorialPage _tutorialPage;
private Coroutine _changedLocaleInstance;
private int _pageIndex;
public Action<TutorialLink> OnPreviousPage;
public Action<TutorialLink> OnNextPage;
private void Awake()
{
LocalizationSettings.SelectedLocaleChanged += OnChangedLocale;
}
private void OnEnable()
{
_titleText.text = Utils.GetLocalizedString(_tutorialInfo.TitleTextIdx);
_descriptionText.text = Utils.GetLocalizedString(_tutorialPage.DescriptionIdx);
}
private void OnDestroy()
{
LocalizationSettings.SelectedLocaleChanged -= OnChangedLocale;
}
private void OnChangedLocale(Locale locale)
{
if (!gameObject.activeInHierarchy) return;
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)
{
_titleText.text = Utils.GetLocalizedString(_tutorialInfo.TitleTextIdx);
_descriptionText.text = Utils.GetLocalizedString(_tutorialPage.DescriptionIdx);
}
}
public override void Open()
{
base.Open();
gameObject.SetActive(true);
}
public override void Close()
{
gameObject.SetActive(false);
base.Close();
}
public void Initialize(TutorialInfo tutorialInfo, int pageindex, Sprite popupSprite)
{
gameObject.SetActive(false);
_tutorialInfo = tutorialInfo;
_pageIndex = pageindex;
_tutorialPage = _tutorialInfo.TutorialPages[_pageIndex];
gameObject.name = $"{_tutorialInfo.TutorialName}{_pageIndex + 1}";
PopupImage.sprite = popupSprite;
if (_tutorialPage.TutorialPageType is TutorialPageType.First or TutorialPageType.Solo)
{
_titleText.text = Utils.GetLocalizedString(_tutorialInfo.TitleTextIdx);
_titleText.enabled = true;
_descriptionTextRect.anchoredPosition = _descriptionTextAnchorPositionInFirst;
_descriptionTImageRect.anchoredPosition = _descriptionImageAnchorPositionInFirst;
}
else
{
_titleText.enabled = false;
_descriptionTextRect.anchoredPosition = _descriptionTextAnchorPositionExceptFirst;
_descriptionTImageRect.anchoredPosition = _descriptionImageAnchorPositionExceptFirst;
}
_descriptionText.text = Utils.GetLocalizedString(_tutorialPage.DescriptionIdx);
_descriptionImage.sprite = _tutorialPage.Sprite;
_pageText.text = $"{_tutorialPage.PageIndex}/{_tutorialInfo.GetPages()}";
}
public void SetupButtons(TutorialLink tutorialLink, Action<TutorialLink> onMovePreviousPage, Action<TutorialLink> onMoveNextPage)
{
_previousButton.onClick.RemoveAllListeners();
_nextButton.onClick.RemoveAllListeners();
switch (_tutorialPage.TutorialPageType)
{
case TutorialPageType.First:
_nextButton.onClick.AddListener(() => onMoveNextPage?.Invoke(tutorialLink));
break;
case TutorialPageType.Middle:
_previousButton.onClick.AddListener(() => onMovePreviousPage?.Invoke(tutorialLink));
_nextButton.onClick.AddListener(() => onMoveNextPage?.Invoke(tutorialLink));
break;
case TutorialPageType.Last:
_previousButton.onClick.AddListener(() => onMovePreviousPage?.Invoke(tutorialLink));
break;
case TutorialPageType.Solo:
break;
}
}
}
}