From 4c110f98c09f73e5615f00b9bfac8d55a7c7aa92 Mon Sep 17 00:00:00 2001 From: "Dominik G." Date: Wed, 29 Oct 2025 19:14:20 +0100 Subject: [PATCH] =?UTF-8?q?Nekopletn=C3=AD=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/UGUIMenuBuilder.cs | 165 +- Game/Hero/Wizard 2.0.prefab | 23 + Game/Hero/Wizard.prefab | 18 + Game/Scripts/UI/SteamNameTag.cs | 250 + Game/Scripts/UI/SteamNameTag.cs.meta | 2 + Scenes/MainMenu.unity | 4 +- UI/Scripts/UGUIMainMenuController.cs | 457 +- UI/UI_Canvas 1.prefab | 17162 +++++++++++++++++++++++++ UI/UI_Canvas 1.prefab.meta | 7 + 9 files changed, 18049 insertions(+), 39 deletions(-) create mode 100644 Game/Scripts/UI/SteamNameTag.cs create mode 100644 Game/Scripts/UI/SteamNameTag.cs.meta create mode 100644 UI/UI_Canvas 1.prefab create mode 100644 UI/UI_Canvas 1.prefab.meta diff --git a/Editor/UGUIMenuBuilder.cs b/Editor/UGUIMenuBuilder.cs index 832cd58..e5f58fb 100644 --- a/Editor/UGUIMenuBuilder.cs +++ b/Editor/UGUIMenuBuilder.cs @@ -23,17 +23,92 @@ namespace MegaKoop.EditorTools canvas = canvasGO.GetComponent(); if (canvas == null) canvas = canvasGO.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; + canvas.sortingOrder = 100; var scaler = canvasGO.GetComponent(); if (scaler == null) scaler = canvasGO.AddComponent(); scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; scaler.referenceResolution = new Vector2(1920, 1080); scaler.matchWidthOrHeight = 0.5f; + var raycaster = canvasGO.GetComponent(); + if (raycaster == null) raycaster = canvasGO.AddComponent(); - // Ensure EventSystem exists - if (Object.FindObjectOfType() == null) + // Ensure/upgrade EventSystem based on available modules + var existingES = Object.FindObjectOfType(); + var inputSystemModuleType = System.Type.GetType("UnityEngine.InputSystem.UI.InputSystemUIInputModule, Unity.InputSystem", false); + bool wantIS = inputSystemModuleType != null; + bool wantLegacy = !wantIS; + + GameObject esGO = null; + if (existingES == null) { - var es = new GameObject("EventSystem", typeof(UnityEngine.EventSystems.EventSystem), typeof(UnityEngine.EventSystems.StandaloneInputModule)); + var es = new GameObject("EventSystem", typeof(UnityEngine.EventSystems.EventSystem)); + if (wantIS) es.AddComponent(inputSystemModuleType); + if (wantLegacy) es.AddComponent(); Undo.RegisterCreatedObjectUndo(es, "Create EventSystem"); + esGO = es; + } + else + { + esGO = existingES.gameObject; + var sim = existingES.GetComponent(); + var ism = inputSystemModuleType != null ? existingES.GetComponent(inputSystemModuleType) : null; + if (wantIS && ism == null) Undo.AddComponent(existingES.gameObject, inputSystemModuleType); + if (wantLegacy && sim == null) Undo.AddComponent(existingES.gameObject); + } + + // Assign actionsAsset only if the picked InputActionAsset contains a "UI" action map + bool assignedUIActions = false; + if (wantIS && inputSystemModuleType != null && esGO != null) + { + var module = esGO.GetComponent(inputSystemModuleType); + if (module != null) + { + var prop = inputSystemModuleType.GetProperty("actionsAsset"); + if (prop != null) + { + var current = prop.GetValue(module, null) as UnityEngine.Object; + if (current == null) + { + var iaaType = System.Type.GetType("UnityEngine.InputSystem.InputActionAsset, Unity.InputSystem", false); + string ChooseUIAsset() + { + var guids = AssetDatabase.FindAssets("t:InputActionAsset"); + foreach (var g in guids) + { + var path = AssetDatabase.GUIDToAssetPath(g); + var asset = AssetDatabase.LoadAssetAtPath(path); + if (asset != null && iaaType != null && iaaType.IsInstanceOfType(asset)) + { + var map = iaaType.GetMethod("FindActionMap", new[] { typeof(string), typeof(bool) })?.Invoke(asset, new object[] { "UI", true }); + if (map != null) return path; + } + } + return null; + } + var best = ChooseUIAsset(); + if (!string.IsNullOrEmpty(best)) + { + var asset = AssetDatabase.LoadAssetAtPath(best); + prop.SetValue(module, asset, null); + var comp = module as Component; if (comp != null) EditorUtility.SetDirty(comp); + assignedUIActions = true; + } + // else: leave null to let module use its default actions + } + else { assignedUIActions = true; } + } + } + } + + if (esGO != null) + { + var hasSIM = esGO.GetComponent() != null; + var hasIS = inputSystemModuleType != null && esGO.GetComponent(inputSystemModuleType) != null; + if (hasIS && !assignedUIActions && !hasSIM) + { + Undo.AddComponent(esGO); + } + Debug.Log($"[UGUIMenuBuilder] EventSystem configured. InputSystem={(hasIS ? "ON" : "OFF")} (actions={(assignedUIActions ? "OK" : "none")}), Standalone={(hasSIM ? "ON" : "OFF")}"); } // Clean old generated panels if present to avoid duplicates @@ -73,9 +148,15 @@ namespace MegaKoop.EditorTools var gfxGroup = CreateVerticalGroup(settingsContainer.transform, "Graphics_Group", 10, TextAnchor.UpperLeft, new RectOffset(10,10,10,10)); CreateText(gfxGroup.transform, "Text_Graphics", "Graphics", 24, TextAnchor.MiddleLeft, Color.white, FontStyles.Bold); - CreateDropdown(gfxGroup.transform, "Dropdown_Quality", new string[]{"Low","Medium","High","Ultra"}); + CreateUnityDropdown(gfxGroup.transform, "Dropdown_Quality", new string[]{"Low","Medium","High","Ultra"}); CreateToggle(gfxGroup.transform, "Toggle_Fullscreen", "Fullscreen", true); - CreateDropdown(gfxGroup.transform, "Dropdown_Resolution", new string[]{"1280x720","1920x1080","2560x1440","3840x2160"}); + CreateUnityDropdown(gfxGroup.transform, "Dropdown_Resolution", new string[]{"1280x720","1920x1080","2560x1440","3840x2160"}); + + var audioGroup = CreateVerticalGroup(settingsContainer.transform, "Audio_Group", 10, TextAnchor.UpperLeft, new RectOffset(10,10,10,10)); + CreateText(audioGroup.transform, "Text_Audio", "Audio", 24, TextAnchor.MiddleLeft, Color.white, FontStyles.Bold); + CreateLabeledSlider(audioGroup.transform, "Master Volume", "Slider_MasterVolume", 0, 100, 100); + CreateLabeledSlider(audioGroup.transform, "Music Volume", "Slider_MusicVolume", 0, 100, 80); + CreateLabeledSlider(audioGroup.transform, "SFX Volume", "Slider_SFXVolume", 0, 100, 100); var settingsButtons = CreateHorizontalGroup(settingsContainer.transform, "Settings_Buttons", 10, TextAnchor.MiddleCenter, new RectOffset(0,0,0,0)); CreateMenuButton(settingsButtons.transform, "Button_ApplySettings", "APPLY"); @@ -206,6 +287,22 @@ namespace MegaKoop.EditorTools return go; } + private static GameObject CreateUnityDropdown(Transform parent, string name, string[] options) + { + var resources = new DefaultControls.Resources(); + var go = DefaultControls.CreateDropdown(resources); + go.name = name; + go.transform.SetParent(parent, false); + var rt = (RectTransform)go.transform; rt.sizeDelta = new Vector2(600, 50); + + var font = Resources.GetBuiltinResource("Arial.ttf"); + foreach (var t in go.GetComponentsInChildren(true)) t.font = font; + var dd = go.GetComponent(); + dd.options = (options != null ? options.Select(o => new Dropdown.OptionData(o)).ToList() : new System.Collections.Generic.List()); + dd.RefreshShownValue(); + return go; + } + private static GameObject CreateVerticalGroup(Transform parent, string name, float spacing, TextAnchor align, RectOffset padding) { var go = new GameObject(name, typeof(RectTransform), typeof(VerticalLayoutGroup), typeof(ContentSizeFitter)); @@ -316,12 +413,18 @@ namespace MegaKoop.EditorTools template.SetActive(false); var templateImg = template.GetComponent(); templateImg.color = new Color(0.1f,0.1f,0.1f,0.95f); + var tplCanvas = template.GetComponent(); + if (tplCanvas == null) tplCanvas = template.AddComponent(); + tplCanvas.overrideSorting = true; + tplCanvas.sortingOrder = 5000; + if (!template.GetComponent()) template.AddComponent(); + // Viewport var viewport = new GameObject("Viewport", typeof(RectTransform), typeof(Mask), typeof(Image)); viewport.transform.SetParent(template.transform, false); var viewportRT = (RectTransform)viewport.transform; viewportRT.anchorMin = new Vector2(0,0); viewportRT.anchorMax = new Vector2(1,1); viewportRT.offsetMin = Vector2.zero; viewportRT.offsetMax = Vector2.zero; - var vImg = viewport.GetComponent(); vImg.color = new Color(0,0,0,0.2f); - viewport.GetComponent().showMaskGraphic = false; + var vImg = viewport.GetComponent(); vImg.color = new Color(0,0,0,0.2f); vImg.raycastTarget = false; + var mask = viewport.GetComponent(); mask.showMaskGraphic = false; // Scroll content var content = new GameObject("Content", typeof(RectTransform), typeof(VerticalLayoutGroup)); @@ -356,6 +459,7 @@ namespace MegaKoop.EditorTools dd.captionText = caption.GetComponent(); dd.itemText = itemLabelGO.GetComponent(); dd.options = options.Select(o => new TMP_Dropdown.OptionData(o)).ToList(); + dd.alphaFadeSpeed = 0.15f; dd.RefreshShownValue(); // ScrollRect wiring @@ -366,6 +470,53 @@ namespace MegaKoop.EditorTools return go; } + private static GameObject CreateSlider(Transform parent, string name, float min, float max, float value) + { + var go = new GameObject(name, typeof(RectTransform), typeof(Slider)); + go.transform.SetParent(parent, false); + var slider = go.GetComponent(); + slider.minValue = min; slider.maxValue = max; slider.value = value; slider.direction = Slider.Direction.LeftToRight; slider.wholeNumbers = true; + var rt = (RectTransform)go.transform; rt.sizeDelta = new Vector2(600, 30); + + var background = new GameObject("Background", typeof(RectTransform), typeof(Image)); + background.transform.SetParent(go.transform, false); + var bgRT = (RectTransform)background.transform; bgRT.anchorMin = new Vector2(0,0.25f); bgRT.anchorMax = new Vector2(1,0.75f); bgRT.offsetMin = Vector2.zero; bgRT.offsetMax = Vector2.zero; + var bgImg = background.GetComponent(); bgImg.color = new Color(0.1f,0.1f,0.1f,1f); + + var fillArea = new GameObject("Fill Area", typeof(RectTransform)); + fillArea.transform.SetParent(go.transform, false); + var faRT = (RectTransform)fillArea.transform; faRT.anchorMin = new Vector2(0,0.25f); faRT.anchorMax = new Vector2(1,0.75f); faRT.offsetMin = new Vector2(10,0); faRT.offsetMax = new Vector2(-10,0); + + var fill = new GameObject("Fill", typeof(RectTransform), typeof(Image)); + fill.transform.SetParent(fillArea.transform, false); + var fillImg = fill.GetComponent(); fillImg.color = new Color(0.4f,0.9f,0.4f,1f); + var fillRT = (RectTransform)fill.transform; fillRT.anchorMin = new Vector2(0,0); fillRT.anchorMax = new Vector2(1,1); fillRT.offsetMin = Vector2.zero; fillRT.offsetMax = Vector2.zero; + + var handleArea = new GameObject("Handle Slide Area", typeof(RectTransform)); + handleArea.transform.SetParent(go.transform, false); + var haRT = (RectTransform)handleArea.transform; haRT.anchorMin = new Vector2(0,0); haRT.anchorMax = new Vector2(1,1); haRT.offsetMin = Vector2.zero; haRT.offsetMax = Vector2.zero; + + var handle = new GameObject("Handle", typeof(RectTransform), typeof(Image)); + handle.transform.SetParent(handleArea.transform, false); + var handleImg = handle.GetComponent(); handleImg.color = new Color(0.8f,1f,0.8f,1f); + var hRT = (RectTransform)handle.transform; hRT.sizeDelta = new Vector2(16, 24); hRT.anchorMin = new Vector2(0.5f,0.5f); hRT.anchorMax = new Vector2(0.5f,0.5f); hRT.anchoredPosition = Vector2.zero; + + slider.fillRect = fill.GetComponent(); + slider.handleRect = handle.GetComponent(); + slider.targetGraphic = handleImg; + slider.direction = Slider.Direction.LeftToRight; + + return go; + } + + private static GameObject CreateLabeledSlider(Transform parent, string label, string name, float min, float max, float value) + { + var group = CreateVerticalGroup(parent, name + "_Group", 4, TextAnchor.UpperLeft, new RectOffset(0,0,0,0)); + CreateText(group.transform, name + "_Label", label, 18, TextAnchor.MiddleLeft, Color.white, FontStyles.Normal); + CreateSlider(group.transform, name, min, max, value); + return group; + } + private static GameObject CreateToggle(Transform parent, string name, string labelText, bool initial) { var go = new GameObject(name, typeof(RectTransform), typeof(Toggle)); diff --git a/Game/Hero/Wizard 2.0.prefab b/Game/Hero/Wizard 2.0.prefab index fea20f2..1a19c01 100644 --- a/Game/Hero/Wizard 2.0.prefab +++ b/Game/Hero/Wizard 2.0.prefab @@ -643,6 +643,7 @@ GameObject: - component: {fileID: 7469640283978802878} - component: {fileID: 1813583201016405249} - component: {fileID: 3442404066554451922} + - component: {fileID: -2591875487324942466} m_Layer: 0 m_Name: Wizard 2.0 m_TagString: Untagged @@ -733,6 +734,10 @@ MonoBehaviour: jumpHeight: 1.6 gravity: -20 groundedGravity: -5 + jumpBufferTime: 0.1 + coyoteTime: 0.1 + upwardGravityMultiplier: 1 + fallGravityMultiplier: 2.5 cameraTransform: {fileID: 6707832248248563092} animator: {fileID: 9099213046038254594} animationDamping: 0.075 @@ -906,6 +911,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.Networking.SteamCharacterNetworkBridge characterController: {fileID: 3919077998180469670} + animator: {fileID: 9099213046038254594} identity: {fileID: 3262185422700989869} rootTransform: {fileID: 3042213512511893744} networkInputProxy: {fileID: 3442404066554451922} @@ -955,6 +961,23 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: e3118c9c432a7acbd824645749251552, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.Networking.NetworkCharacterInputProxy +--- !u!114 &-2591875487324942466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2809934685114486836} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 79fb1fbc20d80f546ba695c751860930, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.UI.SteamNameTag + followHead: {fileID: 852694279969892930} + worldOffset: {x: 0, y: 2.5, z: 0} + billboardToCamera: 1 + hideForLocal: 1 + visibleDistance: 60 --- !u!1 &2999616957953547817 GameObject: m_ObjectHideFlags: 0 diff --git a/Game/Hero/Wizard.prefab b/Game/Hero/Wizard.prefab index 9897424..217fc5e 100644 --- a/Game/Hero/Wizard.prefab +++ b/Game/Hero/Wizard.prefab @@ -1859,6 +1859,7 @@ GameObject: - component: {fileID: 7618815643042096284} - component: {fileID: 2662658783078050447} - component: {fileID: 2417536914360261273} + - component: {fileID: 2931281317230154068} m_Layer: 0 m_Name: Wizard m_TagString: Untagged @@ -2099,6 +2100,23 @@ MonoBehaviour: SwitchTransformSpaceWhenParented: 0 Interpolate: 1 SlerpPosition: 0 +--- !u!114 &2931281317230154068 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7059514996416789454} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 79fb1fbc20d80f546ba695c751860930, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::MegaKoop.Game.UI.SteamNameTag + followHead: {fileID: 7928616218613849049} + worldOffset: {x: 0, y: 1.2, z: 0} + billboardToCamera: 1 + hideForLocal: 1 + visibleDistance: 60 --- !u!1 &7094911519708027617 GameObject: m_ObjectHideFlags: 0 diff --git a/Game/Scripts/UI/SteamNameTag.cs b/Game/Scripts/UI/SteamNameTag.cs new file mode 100644 index 0000000..7089a00 --- /dev/null +++ b/Game/Scripts/UI/SteamNameTag.cs @@ -0,0 +1,250 @@ +using UnityEngine; +using TMPro; +using Steamworks; +using MegaKoop.Game.Networking; + +namespace MegaKoop.Game.UI +{ + [DefaultExecutionOrder(10000)] + [DisallowMultipleComponent] + public class SteamNameTag : MonoBehaviour + { + [SerializeField] private Transform followHead; + [SerializeField] private Vector3 worldOffset = new Vector3(0f, 2.5f, 0f); + [SerializeField] private bool billboardToCamera = true; + [SerializeField] private bool hideForLocal = true; + [SerializeField] private float visibleDistance = 60f; + + private TextMeshPro text; + private Transform tagTransform; + private Transform camTransform; + private SteamCharacterNetworkBridge bridge; + private Callback personaChanged; + private ulong lastSteamId; + private float camFindTimer; + private Coroutine ensureActiveRoutine; + + private void Awake() + { + // Reuse existing NameTag child if present (prevents duplicates when cloning templates) + var existing = transform.Find("NameTag"); + GameObject go; + if (existing != null) + { + tagTransform = existing; + go = existing.gameObject; + } + else + { + go = new GameObject("NameTag"); + go.layer = gameObject.layer; + tagTransform = go.transform; + tagTransform.SetParent(transform, worldPositionStays: false); + } + if (!go.activeSelf) go.SetActive(true); + + text = go.GetComponent(); + if (text == null) + { + text = go.AddComponent(); + } + text.alignment = TextAlignmentOptions.Center; + text.color = Color.white; + text.fontSize = 2.5f; + text.enableAutoSizing = true; + text.fontSizeMin = 1.5f; + text.fontSizeMax = 4.5f; + text.text = GetObjectDisplayName(); + if (!text.gameObject.activeSelf) text.gameObject.SetActive(true); + text.enabled = true; + + bridge = GetComponent(); + + if (followHead == null) + { + followHead = FindChildRecursive(transform, "Head"); + if (followHead == null) + { + followHead = transform; + worldOffset = new Vector3(0f, 2.5f, 0f); + } + } + } + + public void SetFollowHead(Transform head, SteamCharacterNetworkBridge b) + { + if (head != null) followHead = head; + if (b != null) bridge = b; + UpdateDisplayName(true); + } + + private void OnEnable() + { + camTransform = Camera.main != null ? Camera.main.transform : null; + TryCreatePersonaCallback(); + if (tagTransform != null && !tagTransform.gameObject.activeSelf) + { + tagTransform.gameObject.SetActive(true); + } + if (text != null) + { + if (!text.gameObject.activeSelf) text.gameObject.SetActive(true); + text.enabled = true; + } + if (ensureActiveRoutine == null) + { + ensureActiveRoutine = StartCoroutine(EnsureActiveLoop()); + } + UpdateDisplayName(true); + } + + private void OnDisable() + { + personaChanged = null; + if (ensureActiveRoutine != null) + { + StopCoroutine(ensureActiveRoutine); + ensureActiveRoutine = null; + } + } + + private void TryCreatePersonaCallback() + { + if (personaChanged == null) + { + personaChanged = Callback.Create(OnPersonaChanged); + } + } + + private System.Collections.IEnumerator EnsureActiveLoop() + { + var waiter = new WaitForEndOfFrame(); + while (isActiveAndEnabled) + { + if (tagTransform != null && !tagTransform.gameObject.activeSelf) + { + tagTransform.gameObject.SetActive(true); + } + if (text != null) + { + if (!text.gameObject.activeSelf) text.gameObject.SetActive(true); + text.enabled = true; + } + yield return waiter; + } + } + + private void OnPersonaChanged(PersonaStateChange_t cb) + { + if (bridge == null) return; + if (cb.m_ulSteamID == bridge.OwnerSteamId) + { + UpdateDisplayName(true); + } + } + + private void LateUpdate() + { + camFindTimer -= Time.unscaledDeltaTime; + if ((camTransform == null || !camTransform.gameObject.activeInHierarchy) && camFindTimer <= 0f) + { + var cam = Camera.main; + camTransform = cam != null ? cam.transform : null; + camFindTimer = 1f; + } + + // Never deactivate the NameTag GameObject; only toggle text rendering + if (tagTransform != null && !tagTransform.gameObject.activeSelf) + { + tagTransform.gameObject.SetActive(true); + } + + Vector3 basePos = followHead != null ? followHead.position : transform.position; + tagTransform.position = basePos + worldOffset; + + if (billboardToCamera && camTransform != null) + { + Vector3 dir = tagTransform.position - camTransform.position; + if (dir.sqrMagnitude > 0.001f) + { + tagTransform.rotation = Quaternion.LookRotation(dir, Vector3.up); + } + } + + if (text != null) + { + if (!text.gameObject.activeSelf) text.gameObject.SetActive(true); + text.enabled = true; + } + + UpdateDisplayName(false); + } + + private void UpdateDisplayName(bool force) + { + if (text == null) return; + ulong sid = 0; + if (bridge != null) sid = bridge.OwnerSteamId; + if (!force && sid == lastSteamId && !string.IsNullOrEmpty(text.text)) return; + + lastSteamId = sid; + string display = null; + if (sid != 0) + { + display = ResolvePersonaName(sid); + } + if (string.IsNullOrWhiteSpace(display)) + { + display = GetObjectDisplayName(); + } + if (!string.Equals(text.text, display)) + { + text.text = display; + } + } + + private string ResolvePersonaName(ulong sid) + { + if (!SteamBootstrap.IsInitialized) + { + return null; + } + + ulong local = SteamUser.GetSteamID().m_SteamID; + if (sid == local) + { + return SteamFriends.GetPersonaName(); + } + + var csid = new CSteamID(sid); + string name = SteamFriends.GetFriendPersonaName(csid); + if (string.IsNullOrEmpty(name) || name == "???") + { + SteamFriends.RequestUserInformation(csid, true); + } + return name; + } + + private string GetObjectDisplayName() + { + string n = transform.root != null ? transform.root.name : gameObject.name; + if (n.StartsWith("Wizard_")) + { + return n.Substring("Wizard_".Length); + } + return n; + } + + private static Transform FindChildRecursive(Transform root, string name) + { + if (root == null) return null; + foreach (Transform c in root) + { + if (c.name == name) return c; + var r = FindChildRecursive(c, name); + if (r != null) return r; + } + return null; + } + } +} diff --git a/Game/Scripts/UI/SteamNameTag.cs.meta b/Game/Scripts/UI/SteamNameTag.cs.meta new file mode 100644 index 0000000..dbf9ea5 --- /dev/null +++ b/Game/Scripts/UI/SteamNameTag.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 79fb1fbc20d80f546ba695c751860930 \ No newline at end of file diff --git a/Scenes/MainMenu.unity b/Scenes/MainMenu.unity index f6aca4f..0dcc384 100644 --- a/Scenes/MainMenu.unity +++ b/Scenes/MainMenu.unity @@ -198,7 +198,7 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &1602869657 +--- !u!1001 &1722262462 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 @@ -615,4 +615,4 @@ SceneRoots: - {fileID: 1754255436} - {fileID: 1956492400} - {fileID: 1529537539} - - {fileID: 1602869657} + - {fileID: 1722262462} diff --git a/UI/Scripts/UGUIMainMenuController.cs b/UI/Scripts/UGUIMainMenuController.cs index 89236dd..4ba08ec 100644 --- a/UI/Scripts/UGUIMainMenuController.cs +++ b/UI/Scripts/UGUIMainMenuController.cs @@ -6,6 +6,7 @@ using TMPro; #else using TMPro; #endif +using System.Collections.Generic; namespace MegaKoop.UI { @@ -37,6 +38,11 @@ namespace MegaKoop.UI 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() { @@ -44,25 +50,54 @@ namespace MegaKoop.UI RefreshPanelReferences(); // Buttons - btnNewGame = FindButton("Button_NewGame"); - btnContinue = FindButton("Button_Continue"); - btnMultiplayer = FindButton("Button_Multiplayer"); - btnSettings = FindButton("Button_Settings"); - btnQuit = FindButton("Button_Quit"); + 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"); - tgFullscreen = FindToggle("Toggle_Fullscreen"); - ddResolution = FindDropdown("Dropdown_Resolution"); - btnApplySettings = FindButton("Button_ApplySettings"); - btnBackFromSettings = FindButton("Button_BackFromSettings"); + 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) { @@ -93,32 +128,110 @@ namespace MegaKoop.UI return null; } - private Button FindButton(string name) + private Button FindButton(string name, Transform scope = null) { - var go = GameObject.Find(name); - return go ? go.GetComponent