Danro/Assets/Scripts/Settings/UI/SettingsButtonBinder.cs
Danil Iarosh 4d05d1adbb
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
FEAT: Added new settings system
- Добавил новую систему настроек, возможности:
    - Динамически создает список настроек
    - Сохраняет настройки в JSON-файл
    - Возможность группировать настройки
    - Широкие возможности по кастомизации
    - Применение настроек в реальном времени (частично)
- Добавил префабы для новых элементов настроек
- Изменил поведение игры исходя из нового формата настроек
2026-02-04 14:32:15 +03:00

104 lines
3.3 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 void Awake()
{
// Регистрируемся сразу при создании (даже если объект неактивен)
RegisterIfNeeded();
}
private void Start()
{
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);
}
}
private void OnEnable()
{
// На случай если Awake не был вызван (объект был неактивен при загрузке сцены)
RegisterIfNeeded();
}
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()
{
onButtonClick?.Invoke();
}
}
}