using UnityEngine; using UnityEngine.UI; #if UNITY_EDITOR using UnityEditor; using TMPro; #else using TMPro; #endif using System.Collections.Generic; namespace MegaKoop.UI { /// /// UGUI Main Menu controller (no UI Toolkit). Handles switching panels and basic settings. /// public class UGUIMainMenuController : MonoBehaviour { // Panels [Header("Optional Panel Refs (assign to override auto-find)")] [SerializeField] private GameObject panelMainRef; [SerializeField] private GameObject panelSettingsRef; [SerializeField] private GameObject panelLobbyRef; private GameObject panelMain; private GameObject panelSettings; private GameObject panelLobby; [Header("Manual Wiring - Main Menu Buttons")] [SerializeField] private Button btnMultiplayer; [SerializeField] private Button btnSettings; [SerializeField] private Button btnQuit; [Header("Manual Wiring - Settings Controls")] [SerializeField] private TMP_Dropdown ddQuality; [SerializeField] private Toggle tgFullscreen; [SerializeField] private TMP_Dropdown ddResolution; [SerializeField] private Button btnApplySettings; [SerializeField] private Button btnBackFromSettings; [SerializeField] private Slider slMaster; [SerializeField] private Slider slMusic; [SerializeField] private Slider slSFX; private void Awake() { // Panels (created by UGUIMenuBuilder) – najdi i když jsou neaktivní RefreshPanelReferences(); // Buttons btnMultiplayer = EnsureButton(btnMultiplayer, "Button_Multiplayer", panelMain ? panelMain.transform : this.transform); btnSettings = EnsureButton(btnSettings, "Button_Settings", panelMain ? panelMain.transform : this.transform); btnQuit = EnsureButton(btnQuit, "Button_Quit", panelMain ? panelMain.transform : this.transform); // Settings ddQuality = EnsureDropdown(ddQuality, "Dropdown_Quality", panelSettings ? panelSettings.transform : this.transform); tgFullscreen = EnsureToggle(tgFullscreen, "Toggle_Fullscreen", panelSettings ? panelSettings.transform : this.transform); ddResolution = EnsureDropdown(ddResolution, "Dropdown_Resolution", panelSettings ? panelSettings.transform : this.transform); btnApplySettings = EnsureButton(btnApplySettings, "Button_ApplySettings", panelSettings ? panelSettings.transform : this.transform); btnBackFromSettings = EnsureButton(btnBackFromSettings, "Button_BackFromSettings", panelSettings ? panelSettings.transform : this.transform); slMaster = EnsureSlider(slMaster, "Slider_MasterVolume", panelSettings ? panelSettings.transform : this.transform); slMusic = EnsureSlider(slMusic, "Slider_MusicVolume", panelSettings ? panelSettings.transform : this.transform); slSFX = EnsureSlider(slSFX, "Slider_SFXVolume", panelSettings ? panelSettings.transform : this.transform); if (!btnApplySettings && panelSettings) btnApplySettings = FindButtonByLabel("APPLY", panelSettings.transform); if (!btnBackFromSettings && panelSettings) btnBackFromSettings = FindButtonByLabel("BACK", panelSettings.transform); WireEvents(); InitializeSettingsUI(); // Ensure initial panels ShowMainMenu(); } // Allow UGUIMenuBuilder to inject panel refs directly public void SetPanels(GameObject main, GameObject settings, GameObject lobby) { panelMainRef = main; panelSettingsRef = settings; panelLobbyRef = lobby; RefreshPanelReferences(); } public void SetMainMenuButtons(Button multiplayerButton, Button settingsButton, Button quitButton) { btnMultiplayer = multiplayerButton; btnSettings = settingsButton; btnQuit = quitButton; } public void SetSettingsControls(TMP_Dropdown qualityDropdown, Toggle fullscreenToggle, TMP_Dropdown resolutionDropdown, Slider masterVolume, Slider musicVolume, Slider sfxVolume, Button applyButton, Button backButton) { ddQuality = qualityDropdown; tgFullscreen = fullscreenToggle; ddResolution = resolutionDropdown; slMaster = masterVolume; slMusic = musicVolume; slSFX = sfxVolume; btnApplySettings = applyButton; btnBackFromSettings = backButton; } private void RefreshPanelReferences() { panelMain = panelMainRef ? panelMainRef : (FindAnyInScene("Panel_MainMenu") ?? panelMain); panelSettings = panelSettingsRef ? panelSettingsRef : (FindAnyInScene("Panel_Settings") ?? panelSettings); panelLobby = panelLobbyRef ? panelLobbyRef : (FindAnyInScene("Panel_Lobby") ?? panelLobby); } private Button EnsureButton(Button existing, string name, Transform scope) { if (existing) return existing; return FindButton(name, scope); } private TMP_Dropdown EnsureDropdown(TMP_Dropdown existing, string name, Transform scope) { if (existing) return existing; return FindDropdown(name, scope); } private Toggle EnsureToggle(Toggle existing, string name, Transform scope) { if (existing) return existing; return FindToggle(name, scope); } private Slider EnsureSlider(Slider existing, string name, Transform scope) { if (existing) return existing; return FindSlider(name, scope); } private GameObject FindAnyInScene(string name) { // Najde i neaktivní objekty var all = Resources.FindObjectsOfTypeAll(); foreach (var t in all) { if (t.hideFlags != HideFlags.None) continue; var go = t.gameObject; if (!go.scene.IsValid() || !go.scene.isLoaded) continue; if (go.name == name) return go; } return null; } private Button FindButton(string name, Transform scope = null) { if (scope != null) { var comps = scope.GetComponentsInChildren