CapersProject/Assets/02.Scripts/Ui/Tycoon/TutorialPageToggle.cs
2024-12-17 16:42:47 +09:00

140 lines
4.5 KiB
C#

using System;
using System.Collections;
using BlueWater.Utility;
using DG.Tweening;
using Sirenix.OdinInspector;
using TMPro;
using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.Settings;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
namespace BlueWater
{
public class TutorialPageToggle : MonoBehaviour
{
[field: SerializeField]
public RectTransform Rect { get; private set; }
[SerializeField]
private Toggle _toggle;
[SerializeField]
private Image _toggleImage;
[SerializeField]
private TMP_Text _buttonText;
[SerializeField]
private Sprite _selectToggleSprite;
[SerializeField]
private Sprite _deselectToggleSprite;
[Title("연출")]
[SerializeField]
private Vector2 _buttonImageScale = new(1f, 1.3f);
[SerializeField]
private Vector2 _buttonTextPositionY = new(0f, 10f);
[SerializeField]
private float _duration = 0.2f;
private TutorialInfo _tutorialInfo;
private Coroutine _changedLocaleInstance;
private Sequence _selectSequence;
private Sequence _deselectSequence;
public Action<bool> OnToggleEvent;
private void Awake()
{
LocalizationSettings.SelectedLocaleChanged += OnChangedLocale;
}
private void OnDestroy()
{
LocalizationSettings.SelectedLocaleChanged -= OnChangedLocale;
_selectSequence.Kill();
_deselectSequence.Kill();
}
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)
{
_buttonText.text = Utils.GetLocalizedString(_tutorialInfo.TitleTextIdx);
}
}
public void Initialize(TutorialInfo tutorialInfo)
{
_tutorialInfo = tutorialInfo;
gameObject.name = $"{_tutorialInfo.TutorialName}Toggle";
_buttonText.text = Utils.GetLocalizedString(_tutorialInfo.TitleTextIdx);
_selectSequence = DOTween.Sequence()
.Append(_toggleImage.transform.DOScaleY(_buttonImageScale.y, _duration).From(_buttonImageScale.x))
.Join(_buttonText.transform.DOLocalMoveY(_buttonTextPositionY.y, _duration).From(_buttonTextPositionY.x))
.SetEase(Ease.Linear)
.SetUpdate(true)
.SetAutoKill(false)
.Pause();
_deselectSequence = DOTween.Sequence()
.Append(_toggleImage.transform.DOScaleY(_buttonImageScale.x, _duration).From(_buttonImageScale.y))
.Join(_buttonText.transform.DOLocalMoveY(_buttonTextPositionY.x, _duration).From(_buttonTextPositionY.x))
.SetEase(Ease.Linear)
.SetUpdate(true)
.SetAutoKill(false)
.Pause();
_toggle.interactable = true;
_toggle.isOn = false;
_toggleImage.sprite = _deselectToggleSprite;
Vector3 newPosition = _buttonText.transform.localPosition;
newPosition.y = _buttonTextPositionY.x;
_buttonText.transform.localPosition = newPosition;
Vector3 newScale = _toggleImage.transform.localScale;
newScale.y = _buttonImageScale.x;
_toggleImage.transform.localScale = newScale;
}
public void OnToggle(bool isOn)
{
_toggle.isOn = isOn;
_toggle.interactable = !_toggle.isOn;
if (isOn)
{
_toggleImage.sprite = _selectToggleSprite;
_deselectSequence?.Pause();
_selectSequence.Restart();
}
else
{
_toggleImage.sprite = _deselectToggleSprite;
_selectSequence?.Pause();
_deselectSequence.Restart();
}
OnToggleEvent?.Invoke(isOn);
}
}
}