Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- Добавлена система ввода текста через модальное окно с ячейками для аркадного автомата - Реализован TextInputModal с поддержкой кастомных алфавитов и навигации - Добавлен TextInputCell для ввода отдельных символов с циклической навигацией - Создан TextInputSettingsBinder для интеграции ввода текста с системой настроек - Реализована компактная сериализация настроек (только нужные поля в JSON) - Внедрена система баланса игрока (BalanceManager) - Баланс начисляется при оплате импульсом, списывается при начале/продолжении игры - Добавлен InactivityManager для выхода в меню при отсутствии активности (5 минут) - Улучшена система настроек - Добавлены флаги shownInSettings и exposed для управления видимостью настроек - Реализована автоматическая регистрация/отписка SettingsButtonBinder при активации/деактивации - Исправлена загрузка настроек с проверкой типов через Sanitize() - SettingsApplier упрощен - оставлена только поддержка AudioManager - Добавлен ValueSelectorRow для выбора целочисленных значений с шагом - Удалены примеры и документация из production кода (QUICK_SETUP.md, TextInputExample, AdvancedLoggingExample) - Убран весь отладочный вывод Debug.Log из системы настроек и ввода текста - Очищены неразрывные пробелы из файлов проекта - Добавлены префабы UI (InputCell)
134 lines
4.5 KiB
C#
134 lines
4.5 KiB
C#
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();
|
||
}
|
||
}
|
||
}
|