81 lines
3.8 KiB
C#
81 lines
3.8 KiB
C#
using UnityEngine;
|
||||
|
|
using TMPro;
|
|||
|
|
|
|||
|
|
// НАСТРОЙКИ: звук, вибрация, уведомления, графика, частота кадров, сохранение, сброс, о игре.
|
|||
|
|
public class SettingsPanel : BasePanel
|
|||
|
|
{
|
|||
|
|
// Ползунки не должны пересоздаваться посреди перетаскивания
|
|||
|
|
protected override bool RebuildOnChange { get { return false; } }
|
|||
|
|
|
|||
|
|
static readonly string[] QualityNames = { "Низкое", "Среднее", "Высокое" };
|
|||
|
|
|
|||
|
|
protected override void Build(RectTransform root)
|
|||
|
|
{
|
|||
|
|
var d = GP.Data;
|
|||
|
|
var list = ScrollList(root);
|
|||
|
|
|
|||
|
|
// --- Звук ---
|
|||
|
|
var sound = UIKit.Card(list);
|
|||
|
|
ProfilePanel.Header(sound, "Звук");
|
|||
|
|
SliderRow(sound, "Музыка", d.musicVolume, v => { d.musicVolume = v; GP.ApplySettings(); GP.SaveSoon(); });
|
|||
|
|
SliderRow(sound, "Звуки", d.soundVolume, v => { d.soundVolume = v; GP.ApplySettings(); GP.SaveSoon(); });
|
|||
|
|
|
|||
|
|
// --- Общие ---
|
|||
|
|
var general = UIKit.Card(list);
|
|||
|
|
ProfilePanel.Header(general, "Общие");
|
|||
|
|
SwitchRow(general, "Вибрация", d.vibration, v => { d.vibration = v; GP.SaveSoon(); if (v) GP.Vibrate(); });
|
|||
|
|
SwitchRow(general, "Уведомления", d.notifications, v => { d.notifications = v; GP.SaveSoon(); });
|
|||
|
|
|
|||
|
|
// --- Графика ---
|
|||
|
|
var gfx = UIKit.Card(list);
|
|||
|
|
ProfilePanel.Header(gfx, "Графика");
|
|||
|
|
UIKit.Text(gfx, "Качество", 28, UIKit.Theme.TextDim);
|
|||
|
|
UIKit.Tabs(gfx, QualityNames, d.quality, i =>
|
|||
|
|
{
|
|||
|
|
d.quality = i; GP.ApplySettings(); GP.SaveSoon(); RequestRebuild();
|
|||
|
|
});
|
|||
|
|
SwitchRow(gfx, "60 кадров/сек (больше расход батареи)", d.fps60, v => { d.fps60 = v; GP.ApplySettings(); GP.SaveSoon(); });
|
|||
|
|
|
|||
|
|
// --- Игра ---
|
|||
|
|
var game = UIKit.Card(list);
|
|||
|
|
ProfilePanel.Header(game, "Игра");
|
|||
|
|
UIKit.Button(game, "Сохранить игру сейчас", UIKit.Theme.Blue, () =>
|
|||
|
|
{
|
|||
|
|
if (SaveManager.Instance != null) SaveManager.Instance.SaveGame();
|
|||
|
|
GP.Save();
|
|||
|
|
UIKit.Toast("Игра сохранена");
|
|||
|
|
}, -1, 90);
|
|||
|
|
UIKit.Button(game, "Сбросить весь прогресс", UIKit.Theme.Red, () =>
|
|||
|
|
UIKit.Confirm("Сбросить прогресс?",
|
|||
|
|
"Удалятся все здания, ресурсы, войска, герой и задания. Отменить это нельзя.",
|
|||
|
|
"Сбросить", () => { GP.ResetAll(); if (UIPanelManager.Instance != null) UIPanelManager.Instance.CloseAll(); }),
|
|||
|
|
-1, 90);
|
|||
|
|
|
|||
|
|
// --- О игре ---
|
|||
|
|
var about = UIKit.Card(list);
|
|||
|
|
ProfilePanel.Header(about, "О игре");
|
|||
|
|
ProfilePanel.KV(about, "Версия", Application.version);
|
|||
|
|
ProfilePanel.KV(about, "ID игрока", d.playerId);
|
|||
|
|
UIKit.Text(about, "MVP1 • команда 4bit", 24, UIKit.Theme.TextDim, TextAlignmentOptions.Center);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void SliderRow(Transform parent, string label, float value, System.Action<float> onChange)
|
|||
|
|
{
|
|||
|
|
var r = UIKit.Row(parent, 70, 20);
|
|||
|
|
var t = UIKit.Text(r, label, 28);
|
|||
|
|
UIKit.Size(t, 200);
|
|||
|
|
var pct = UIKit.Text(r, Mathf.RoundToInt(value * 100) + "%", 26, UIKit.Theme.TextDim, TextAlignmentOptions.Right);
|
|||
|
|
UIKit.Slider(r, value, v => { pct.text = Mathf.RoundToInt(v * 100) + "%"; onChange(v); });
|
|||
|
|
pct.transform.SetAsLastSibling();
|
|||
|
|
UIKit.Size(pct, 90);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void SwitchRow(Transform parent, string label, bool value, System.Action<bool> onChange)
|
|||
|
|
{
|
|||
|
|
var r = UIKit.Row(parent, 76, 20);
|
|||
|
|
var t = UIKit.Text(r, label, 28);
|
|||
|
|
UIKit.Size(t, -1, -1, 1);
|
|||
|
|
UIKit.Switch(r, value, onChange);
|
|||
|
|
}
|
|||
|
|
}
|