using RR.Common.Settings; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; namespace RR.Common.UI { /// /// Биндер для кнопок в настройках. /// Позволяет назначать действия кнопки настроек прямо на объекты сцены. /// public class SettingsButtonBinder : MonoBehaviour { [Header("Binding")] [Tooltip("Ключ кнопки из SettingsDatabase")] [SerializeField] private string key; /// /// Ключ кнопки для диспетчера /// 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(); } /// /// Вызывается при нажатии кнопки (из диспетчера или напрямую) /// public void Invoke() { onButtonClick?.Invoke(); } } }