using TMPro; using UnityEngine; using DG.Tweening; public class LetterSlot : MonoBehaviour { [SerializeField] private TextMeshProUGUI _label; [Header("Анимация выбора")] [SerializeField] private float _normalScale = 1f; [SerializeField] private float _selectedScale = 1.1f; [SerializeField] private Color _normalColor; [SerializeField] private Color _selectedColor; [SerializeField] private float _animationDuration = 0.2f; private int _symbolIndex; private string _alphabet; private Sequence _animation; public char Symbol => _alphabet[_symbolIndex]; private void OnDestroy() => StopAnimation(); public void Init(char symbol, string alphabet) { _alphabet = alphabet; _symbolIndex = _alphabet.IndexOf(symbol); if( _symbolIndex < 0 ) _symbolIndex = 0; SetSymbol(_symbolIndex); SetSelected(false, instant: true); } public void SetSelected(bool selected, bool instant = false) { StopAnimation(); float targetScale = selected ? _selectedScale : _normalScale; Color targetColor = selected ? _selectedColor : _normalColor; if (instant) { transform.localScale = Vector3.one * targetScale; _label.color = targetColor; return; } _animation = DOTween.Sequence(); _animation.Join(transform.DOScale(targetScale, _animationDuration)); _animation.Join(_label.DOColor(targetColor, _animationDuration)); _animation.PlayForward(); } public void ChangeSymbol(int direction) { _symbolIndex = (_symbolIndex + direction + _alphabet.Length) % _alphabet.Length; SetSymbol(_symbolIndex); } public void SetSymbol(int index) { _symbolIndex = index; _label.text = Symbol.ToString(); } public void SetSymbol(char symbol) { int index = _alphabet.IndexOf(symbol); if (index < 0) SetSymbol(0); else SetSymbol(index); } private void StopAnimation() { if (_animation != null) { _animation.Kill(); _animation = null; } } }