sega 116b9b3116 Рефакторинг Character.cs: приведение к SRP и вынос логики
Инкапсулированы методы появления и ухода персонажа
Инкапсулирована работа с аниматором
Работа с репликами вынесена в ScriptableObject
Логика MessageBox вынесена в отдельный класс
Переработан event bus персонажей
Сложность и призовой модуль вынесены в отдельные классы
Character.cs приведён к Single Responsibility Principle.
2026-08-13 16:19:56 +03:00

59 lines
1.6 KiB
C#

using CharacterSystem;
using System;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class CharacterSelectionPanel : MonoBehaviour, IControl
{
public event Action<Character> BeforeCharacterChange;
public event Action<Character> OnCharacterChanged;
[SerializeField] TextMeshProUGUI CharacterNameLabel;
[SerializeField] Image CharacterIcon;
[SerializeField] float ChangeCharacterInterval = 0.15f;
[SerializeField] AudioClip ClickSound;
private float LastSwipeTime = 0;
private Character[] characters;
public int CharacterIndex { get; private set; }
public int CharactersCount => characters.Length;
public Character SelectedCharacter => characters[CharacterIndex];
private bool CanSwipe => Time.time - LastSwipeTime > ChangeCharacterInterval;
private void OnEnable()
{
characters = CharactersController.GetCharactersArray();
CharacterIndex = 0;
DisplaySelectedCharacter();
}
public void Swipe(int direction)
{
if (CanSwipe)
{
if (ClickSound != null) { SoundManager.instance.playClip(ClickSound); }
BeforeCharacterChange?.Invoke(SelectedCharacter);
CharacterIndex = (CharacterIndex + direction + CharactersCount) % CharactersCount;
DisplaySelectedCharacter();
OnCharacterChanged?.Invoke(SelectedCharacter);
LastSwipeTime = Time.time;
}
}
public void Switch() { }
private void DisplaySelectedCharacter()
{
CharacterNameLabel.text = SelectedCharacter.characterName;
CharacterIcon.sprite = SelectedCharacter.visualModule.icon;
}
}