using CharacterSystem; using PrizeSystem; using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.Serialization; using UnityEngine.UI; public class CharacterSelectionPanel : MonoBehaviour, IControlable { public event Action OnCharacterSelected; public event Action OnExitRequested; [SerializeField, FormerlySerializedAs("CharacterNameLabel")] private TextMeshProUGUI _characterNameLabel; [SerializeField, FormerlySerializedAs("CharacterIcon")] private Image _characterIcon; [SerializeField] private RectTransform _prizeTable; [SerializeField] private PrizeView _prizeViewPrefab; [SerializeField] private AudioClip _clickClip; [SerializeField, FormerlySerializedAs("buttons")] private List _buttons; [SerializeField] private MSignalButton _selectButton; [SerializeField] private MSignalButton _exitButton; private CharacterDefinition[] _characters; private int _characterIndex; private int _buttonIndex; public int CharactersCount => _characters?.Length ?? 0; public CharacterDefinition SelectedCharacter => _characters[_characterIndex]; public bool ControlsEnabled { get; set; } = true; private MSignalButton SelectedButton => _buttons[_buttonIndex]; private void Awake() { _selectButton.OnClick += SelectCharacter; _exitButton.OnClick += RequestExit; } private void Start() { _characters = CharactersController.I.GetDefinitionsArray(); Open(); } private void OnDestroy() { _selectButton.OnClick -= SelectCharacter; _exitButton.OnClick -= RequestExit; } public void Open() { if (_buttons == null || _buttons.Count == 0) return; SelectedButton.DeselectAnimation(); _buttonIndex = 0; SelectedButton.SelectAnimation(); if (_characters == null || _characters.Length == 0) return; _characterIndex = Mathf.Clamp(_characterIndex, 0, _characters.Length - 1); DisplaySelectedCharacter(); } public void SwitchCharacter(int direction) { if (direction == 0 || CharactersCount < 2) return; _characterIndex = (_characterIndex + direction + _characters.Length) % _characters.Length; DisplaySelectedCharacter(); SoundManager.instance.PlaySfx(_clickClip); } public void SwitchButton(int direction) { if (direction == 0) return; int newIndex = Mathf.Clamp(_buttonIndex + direction, 0, _buttons.Count - 1); if (newIndex == _buttonIndex) return; SelectedButton.DeselectAnimation(); _buttonIndex = newIndex; SelectedButton.SelectAnimation(); SoundManager.instance.PlaySfx(_clickClip); } public void UpdateControls() { if (CharactersCount == 0) return; Vector2Int axes = In.GetAxis(JoystickSide.Both, InteractMode.Discrete); SwitchCharacter(axes.x); SwitchButton(-axes.y); SelectedButton.TakeInput(In.GetAction(JoystickSide.Both, InteractMode.Continious)); } private void SelectCharacter() { OnCharacterSelected?.Invoke(SelectedCharacter); } private void RequestExit() { OnExitRequested?.Invoke(); } private void DisplaySelectedCharacter() { _characterNameLabel.text = SelectedCharacter.CharacterName; _characterIcon.sprite = SelectedCharacter.Icon; ClearTable(); PrizeSet prizeSet = PrizeSystemManager.PrizeContainer.Sets[SelectedCharacter.CharacterIndex]; DisplayPrizeSet(prizeSet); } private void ClearTable() { for (int i = _prizeTable.childCount - 1; i >= 0; i--) { Transform child = _prizeTable.GetChild(i); child.SetParent(null, false); Destroy(child.gameObject); } } private void DisplayPrizeSet(PrizeSet prizeSet) { foreach (Prize prize in prizeSet.Prizes) { PrizeView view = Instantiate(_prizeViewPrefab, _prizeTable); view.SetPrize(prize); } } }