Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- Добавил новую систему настроек, возможности:
- Динамически создает список настроек
- Сохраняет настройки в JSON-файл
- Возможность группировать настройки
- Широкие возможности по кастомизации
- Применение настроек в реальном времени (частично)
- Добавил префабы для новых элементов настроек
- Изменил поведение игры исходя из нового формата настроек
104 lines
3.3 KiB
C#
104 lines
3.3 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 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();
|
||
}
|
||
}
|
||
}
|