100 lines
4.2 KiB
C#
100 lines
4.2 KiB
C#
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 — выбор игрока хранится в GameManager._effectiveMode,
|
||
// чтобы два одновременных экземпляра не перетирали глобальные настройки друг друга.
|
||
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);
|
||
}
|
||
}
|
||
}
|