using System.Linq; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.InputSystem; using UnityEngine.SceneManagement; namespace RR.Common.UI { public class LevelSelectModal : MonoBehaviour { [Header("Управление")] [SerializeField] private InputActionReference close; [Header("UI")] [SerializeField] private CanvasGroup canvasGroup; [SerializeField] private Transform content; // Grid parent [SerializeField] private LevelButton levelButtonPrefab; [SerializeField] private Button closeButton; [SerializeField] private float fadeDuration = 0.15f; private readonly List _levelsPool = new(); private void Awake() { if (closeButton) closeButton.onClick.AddListener(Close); gameObject.SetActive(false); } // ==== ПУБЛИЧНЫЙ API ==== /// /// Метод для открытия модального окна /// public void Open() { BuildIfNeeded(); gameObject.SetActive(true); StopAllCoroutines(); StartCoroutine(Fade(0f, 1f, fadeDuration)); } /// /// Метод для закрытия модального окна /// private void Close() { StopAllCoroutines(); StartCoroutine(Fade(1f, 0f, fadeDuration, () => gameObject.SetActive(false))); } // ==== ВНУТРЕННЕЕ ==== /// /// Метод для сборки кнопок уровней /// private void BuildIfNeeded() { // Очистим/пересоберём foreach (LevelButton b in _levelsPool.Where(b => b)) { Destroy(b.gameObject); } _levelsPool.Clear(); List levels = EnumerateLevelScenesInBuild() .OrderBy(e => e.world) .ThenBy(e => e.stage) .ToList(); foreach (LevelButton btn in levels.Select(lv => Instantiate(levelButtonPrefab, content))) { _levelsPool.Add(btn); } for (int index = 0; index < _levelsPool.Count; index++) { LevelButton btn = _levelsPool[index]; // if (index == 0) btn.Setup( // $"{levels[index].world}-{levels[index].stage}", // levels[index].world, // levels[index].stage, // onDown: closeButton, // onUp: closeButton, // onLeft: closeButton, // onRight: _levelsPool.Count > 1 ? _levelsPool[1].GetComponent