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;
// Main buttons
private Button btnNewGame;
private Button btnContinue;
private Button btnMultiplayer;
private Button btnSettings;
private Button btnQuit;
// Settings controls
private TMP_Dropdown ddQuality;
private Toggle tgFullscreen;
private TMP_Dropdown ddResolution;
private Button btnApplySettings;
private Button btnBackFromSettings;
private Slider slMaster;
private Slider slMusic;
private Slider slSFX;
private Dropdown ddQualityUI;
private Dropdown ddResolutionUI;
private void Awake()
{
// Panels (created by UGUIMenuBuilder) – najdi i když jsou neaktivní
RefreshPanelReferences();
// Buttons
btnNewGame = FindButton("Button_NewGame", panelMain ? panelMain.transform : this.transform);
btnContinue = FindButton("Button_Continue", panelMain ? panelMain.transform : this.transform);
btnMultiplayer = FindButton("Button_Multiplayer", panelMain ? panelMain.transform : this.transform);
btnSettings = FindButton("Button_Settings", panelMain ? panelMain.transform : this.transform);
btnQuit = FindButton("Button_Quit", panelMain ? panelMain.transform : this.transform);
// Settings
ddQuality = FindDropdown("Dropdown_Quality", panelSettings ? panelSettings.transform : this.transform);
if (!ddQuality) ddQualityUI = FindUIDropdown("Dropdown_Quality", panelSettings ? panelSettings.transform : this.transform);
tgFullscreen = FindToggle("Toggle_Fullscreen", panelSettings ? panelSettings.transform : this.transform);
ddResolution = FindDropdown("Dropdown_Resolution", panelSettings ? panelSettings.transform : this.transform);
if (!ddResolution) ddResolutionUI = FindUIDropdown("Dropdown_Resolution", panelSettings ? panelSettings.transform : this.transform);
btnApplySettings = FindButton("Button_ApplySettings", panelSettings ? panelSettings.transform : this.transform);
btnBackFromSettings = FindButton("Button_BackFromSettings", panelSettings ? panelSettings.transform : this.transform);
slMaster = FindSlider("Slider_MasterVolume", panelSettings ? panelSettings.transform : this.transform);
slMusic = FindSlider("Slider_MusicVolume", panelSettings ? panelSettings.transform : this.transform);
slSFX = FindSlider("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();
}
private Dropdown FindUIDropdown(string name, Transform scope = null)
{
if (scope != null)
{
var comps = scope.GetComponentsInChildren(true);
foreach (var c in comps)
{
if (c && c.name == name) return c;
}
return null;
}
var all = Resources.FindObjectsOfTypeAll();
foreach (var c in all)
{
if (c && c.name == name && c.gameObject.scene.IsValid() && c.gameObject.scene.isLoaded) return c;
}
return null;
}
// Allow UGUIMenuBuilder to inject panel refs directly
public void SetPanels(GameObject main, GameObject settings, GameObject lobby)
{
panelMainRef = main;
panelSettingsRef = settings;
panelLobbyRef = lobby;
RefreshPanelReferences();
}
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 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