Danro/Assets/Scripts/Settings/UI/SettingsButtonBinder.cs
Danil Iarosh 2417f58f61
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
feat: Add text input system and balance management with settings improvements
- Добавлена система ввода текста через модальное окно с ячейками для аркадного автомата
- Реализован TextInputModal с поддержкой кастомных алфавитов и навигации
- Добавлен TextInputCell для ввода отдельных символов с циклической навигацией
- Создан TextInputSettingsBinder для интеграции ввода текста с системой настроек
- Реализована компактная сериализация настроек (только нужные поля в JSON)

- Внедрена система баланса игрока (BalanceManager)
- Баланс начисляется при оплате импульсом, списывается при начале/продолжении игры
- Добавлен InactivityManager для выхода в меню при отсутствии активности (5 минут)

- Улучшена система настроек
- Добавлены флаги shownInSettings и exposed для управления видимостью настроек
- Реализована автоматическая регистрация/отписка SettingsButtonBinder при активации/деактивации
- Исправлена загрузка настроек с проверкой типов через Sanitize()
- SettingsApplier упрощен - оставлена только поддержка AudioManager
- Добавлен ValueSelectorRow для выбора целочисленных значений с шагом

- Удалены примеры и документация из production кода (QUICK_SETUP.md, TextInputExample, AdvancedLoggingExample)
- Убран весь отладочный вывод Debug.Log из системы настроек и ввода текста
- Очищены неразрывные пробелы из файлов проекта
- Добавлены префабы UI (InputCell)
2026-02-11 16:27:33 +03:00

134 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using RR.Common.Settings;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
namespace RR.Common.UI
{
/// <summary>
/// Биндер для кнопок в настройках.
/// Позволяет назначать действия кнопки настроек прямо на объекты сцены.
/// </summary>
public class SettingsButtonBinder : MonoBehaviour
{
[Header("Binding")]
[Tooltip("Ключ кнопки из SettingsDatabase")]
[SerializeField] private string key;
/// <summary>
/// Ключ кнопки для диспетчера
/// </summary>
public string Key => key;
[Header("UI Elements (опционально)")]
[SerializeField] private Button button;
[SerializeField] private TMP_Text label;
[Header("Action")]
[Tooltip("Действие, выполняемое при нажатии кнопки")]
[SerializeField] private UnityEvent onButtonClick;
private SettingEntry def;
private bool isRegistered;
private TextInputSettingsBinder textInputBinder;
private void Awake()
{
Debug.Log($"[SettingsButtonBinder] Awake() called for key '{key}' on GameObject '{gameObject.name}'");
// Получаем ссылку на TextInputSettingsBinder если он есть
textInputBinder = GetComponent<TextInputSettingsBinder>();
if (textInputBinder != null)
{
Debug.Log($"[SettingsButtonBinder] Found TextInputSettingsBinder on GameObject '{gameObject.name}'");
}
// НЕ регистрируемся в Awake - только при OnEnable
}
private void Start()
{
Debug.Log($"[SettingsButtonBinder] Start() called for key '{key}'");
if (string.IsNullOrWhiteSpace(key)) return;
if (SettingsManager.Instance)
{
def = SettingsManager.Instance.Define(key);
}
// Установка текста кнопки если есть
if (label && def != null)
{
string text = !string.IsNullOrEmpty(def.buttonText) ? def.buttonText : def.displayName;
if (string.IsNullOrEmpty(text)) text = key;
label.text = text;
}
// Привязка действия к локальной кнопке если есть
if (button)
{
button.onClick.RemoveAllListeners();
button.onClick.AddListener(OnButtonClick);
Debug.Log($"[SettingsButtonBinder] Attached OnButtonClick to button for key '{key}'");
}
}
private void OnEnable()
{
// Регистрируемся только когда объект активен
RegisterIfNeeded();
}
private void OnDisable()
{
// Отписываемся при деактивации
if (isRegistered)
{
SettingsButtonDispatcher.Unregister(key, this);
isRegistered = false;
}
}
private void OnDestroy()
{
// Отписываемся только при уничтожении (на всякий случай)
if (isRegistered)
{
SettingsButtonDispatcher.Unregister(key, this);
isRegistered = false;
}
}
private void RegisterIfNeeded()
{
if (isRegistered || string.IsNullOrWhiteSpace(key)) return;
SettingsButtonDispatcher.Register(key, this);
isRegistered = true;
}
private void OnButtonClick()
{
Invoke();
}
/// <summary>
/// Вызывается при нажатии кнопки (из диспетчера или напрямую)
/// </summary>
public void Invoke()
{
// Если есть TextInputSettingsBinder, вызываем его
if (textInputBinder != null)
{
textInputBinder.OpenTextInput();
}
// Вызываем обычные действия кнопки
onButtonClick?.Invoke();
}
}
}