Danro/Assets/Scripts/Settings/UI/SettingsGroupPanel.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

75 lines
2.4 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 System;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace RR.Common.UI
{
public class SettingsGroupPanel : MonoBehaviour
{
[Header("Wiring")]
[SerializeField] private TMP_Text titleText;
[SerializeField] private Button headerButton;
[SerializeField] private GameObject contentRoot; // сюда будут инстанситься строки настроек
[Header("Optional icons")]
[SerializeField] private GameObject iconExpanded;
[SerializeField] private GameObject iconCollapsed;
public Transform ContentRoot => contentRoot ? contentRoot.transform : transform;
/// <summary>
/// Событие вызывается при сворачивании/разворачивании группы
/// </summary>
public event Action<SettingsGroupPanel, bool> OnExpandedChanged;
private bool expanded = true;
private string prefsKey;
private bool rememberState;
public void Init(string title, string prefsKey, bool defaultExpanded, bool rememberState)
{
this.prefsKey = prefsKey;
this.rememberState = rememberState;
if (titleText) titleText.text = title;
bool startExpanded = defaultExpanded;
if (this.rememberState && !string.IsNullOrEmpty(this.prefsKey))
startExpanded = PlayerPrefs.GetInt(this.prefsKey, defaultExpanded ? 1 : 0) == 1;
SetExpanded(startExpanded, save: false);
if (headerButton)
{
headerButton.onClick.RemoveAllListeners();
headerButton.onClick.AddListener(Toggle);
}
}
public void Toggle() => SetExpanded(!expanded, save: true);
public void SetExpanded(bool value, bool save)
{
expanded = value;
if (contentRoot) contentRoot.SetActive(expanded);
if (iconExpanded) iconExpanded.SetActive(expanded);
if (iconCollapsed) iconCollapsed.SetActive(!expanded);
if (save && rememberState && !string.IsNullOrEmpty(prefsKey))
{
PlayerPrefs.SetInt(prefsKey, expanded ? 1 : 0);
PlayerPrefs.Save();
}
// Чтобы лэйаут сразу пересчитался
var rt = transform as RectTransform;
if (rt) LayoutRebuilder.ForceRebuildLayoutImmediate(rt);
// Уведомляем подписчиков об изменении состояния
OnExpandedChanged?.Invoke(this, expanded);
}
}
}