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