sea-battle/Assets/Scripts/UI/Panels/GameModeSelectPanel.cs

99 lines
3.9 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 UnityEngine;
using UnityEngine.UI;
using TMPro;
/// <summary>
/// Панель выбора режима игры.
/// Три кнопки — «Классика», «Растущие поля», «Рифы».
/// Навигация клавишами — через PlayerCursorUI (InputMode.UI).
/// </summary>
public class GameModeSelectPanel : MonoBehaviour
{
[Header("Кнопки режимов (порядок: Классика, Растущие поля, Рифы)")]
[SerializeField] private Button buttonClassic;
[SerializeField] private Button buttonGrowing;
[SerializeField] private Button buttonReefs;
[Header("Отображение")]
[SerializeField] private Image previewImage;
[SerializeField] private TMP_Text descriptionText;
[Header("Картинки режимов (порядок: Классика, Растущие поля, Рифы)")]
[SerializeField] private Sprite spriteClassic;
[SerializeField] private Sprite spriteGrowing;
[SerializeField] private Sprite spriteReefs;
[Header("Описания режимов")]
[SerializeField, TextArea(3, 6)] private string descClassic = "Классический режим 10×10. Стандартные правила морского боя.";
[SerializeField, TextArea(3, 6)] private string descGrowing = "Растущие поля — размер поля и количество кораблей увеличиваются с каждым уровнем.";
[SerializeField, TextArea(3, 6)] private string descReefs = "Рифы — на поле расставляются случайные рифы, меняя тактику боя.";
private static readonly string[] ModeNames = { "Классика", "Растущие поля", "Рифы" };
private Button[] _buttons;
private Sprite[] _sprites;
private string[] _descriptions;
private int _selectedIndex;
private void Awake()
{
_buttons = new[] { buttonClassic, buttonGrowing, buttonReefs };
_sprites = new[] { spriteClassic, spriteGrowing, spriteReefs };
_descriptions = new[] { descClassic, descGrowing, descReefs };
for (int i = 0; i < _buttons.Length; i++)
{
int idx = i;
if (_buttons[i] == null) continue;
_buttons[i].onClick.AddListener(() => SelectMode(idx));
// При смене фокуса — обновляем превью и описание
var hl = _buttons[i].GetComponent<UIButtonHighlight>();
if (hl != null)
hl.onFocused = () => UpdatePreview(idx);
}
}
private void OnEnable()
{
SyncFromSettings();
}
/// <summary>Обновляет только картинку и описание — без сохранения настройки и без подсветки.</summary>
private void UpdatePreview(int index)
{
if (previewImage != null) previewImage.sprite = _sprites [index];
if (descriptionText != null) descriptionText.text = _descriptions[index];
}
public void SelectMode(int index)
{
if (index < 0 || index >= ModeNames.Length) return;
_selectedIndex = index;
SettingsManager.instance?.ChangeSetting("Режим игры", index);
RefreshUI();
}
private void SyncFromSettings()
{
string current = SettingsManager.instance?.GetSettingValue("Режим игры") ?? "Классика";
int idx = System.Array.IndexOf(ModeNames, current);
_selectedIndex = idx >= 0 ? idx : 0;
RefreshUI();
}
private void RefreshUI()
{
UpdatePreview(_selectedIndex);
for (int i = 0; i < _buttons.Length; i++)
{
if (_buttons[i] == null) continue;
var hl = _buttons[i].GetComponent<UIButtonHighlight>();
if (hl != null)
hl.SetHighlighted(i == _selectedIndex);
}
}
}