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)
119 lines
4.4 KiB
C#
119 lines
4.4 KiB
C#
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();
|
||
}
|
||
}
|
||
}
|