using UnityEngine; using UnityEngine.UI; using TMPro; /// /// Панель выбора режима игры. /// Три кнопки — «Классика», «Растущие поля», «Рифы». /// Навигация клавишами — через PlayerCursorUI (InputMode.UI). /// 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(); if (hl != null) hl.onFocused = () => UpdatePreview(idx); } } private void OnEnable() { SyncFromSettings(); } /// Обновляет только картинку и описание — без сохранения настройки и без подсветки. 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(); if (hl != null) hl.SetHighlighted(i == _selectedIndex); } } }