Danro/Assets/Scripts/Settings/Core/SettingsButtonDispatcher.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

119 lines
4.4 KiB
C#
Raw Permalink 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 System.Collections.Generic;
using RR.Common.UI;
using UnityEngine;
namespace RR.Common.Settings
{
/// <summary>
/// Диспетчер для связи кнопок настроек с объектами на сцене.
/// Позволяет объектам сцены подписываться на нажатия кнопок по ключу.
/// </summary>
public static class SettingsButtonDispatcher
{
private static readonly Dictionary<string, List<SettingsButtonBinder>> bindings = new();
/// <summary>
/// Регистрирует биндер для указанного ключа кнопки
/// </summary>
public static void Register(string buttonKey, SettingsButtonBinder binder)
{
if (string.IsNullOrWhiteSpace(buttonKey) || binder == null) return;
if (!bindings.TryGetValue(buttonKey, out var list))
{
list = new List<SettingsButtonBinder>();
bindings[buttonKey] = list;
}
if (!list.Contains(binder))
{
list.Add(binder);
}
}
/// <summary>
/// Удаляет биндер для указанного ключа кнопки
/// </summary>
public static void Unregister(string buttonKey, SettingsButtonBinder binder)
{
if (string.IsNullOrWhiteSpace(buttonKey) || binder == null) return;
if (bindings.TryGetValue(buttonKey, out var list))
{
list.Remove(binder);
if (list.Count == 0)
{
bindings.Remove(buttonKey);
}
}
}
/// <summary>
/// Вызывает все зарегистрированные биндеры для указанного ключа кнопки
/// </summary>
/// <returns>True если хотя бы один биндер был вызван</returns>
public static bool Dispatch(string buttonKey)
{
if (string.IsNullOrWhiteSpace(buttonKey))
{
return false;
}
// Пробуем найти в зарегистрированных биндерах
if (bindings.TryGetValue(buttonKey, out var list) && list.Count > 0)
{
return InvokeBinders(list);
}
// Fallback: ищем ВСЕ биндеры в сцене (включая на неактивных объектах)
var allBinders = Object.FindObjectsByType<SettingsButtonBinder>(FindObjectsInactive.Include, FindObjectsSortMode.None);
var matchingBinders = new List<SettingsButtonBinder>();
foreach (var binder in allBinders)
{
// Проверяем что биндер имеет нужный ключ и компонент enabled
if (binder.enabled && binder.Key == buttonKey)
{
matchingBinders.Add(binder);
// Регистрируем для будущих вызовов
Register(buttonKey, binder);
}
}
if (matchingBinders.Count > 0)
{
return InvokeBinders(matchingBinders);
}
return false;
}
private static bool InvokeBinders(List<SettingsButtonBinder> binders)
{
bool anyInvoked = false;
// Копируем список чтобы избежать проблем при модификации во время итерации
var copy = new List<SettingsButtonBinder>(binders);
foreach (var binder in copy)
{
if (binder != null)
{
binder.Invoke();
anyInvoked = true;
}
}
return anyInvoked;
}
/// <summary>
/// Очищает все регистрации (вызывать при смене сцены если нужно)
/// </summary>
public static void Clear()
{
bindings.Clear();
}
}
}