Refaktro funguje lol
This commit is contained in:
200
Editor/LobbyPanelBuilder.cs
Normal file
200
Editor/LobbyPanelBuilder.cs
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
#if UNITY_EDITOR
|
||||||
|
using TMPro;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
namespace MegaKoop.EditorTools
|
||||||
|
{
|
||||||
|
internal sealed class LobbyPanelBuilder
|
||||||
|
{
|
||||||
|
private readonly Transform _parent;
|
||||||
|
|
||||||
|
internal LobbyPanelBuilder(Transform parent)
|
||||||
|
{
|
||||||
|
_parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal GameObject Build()
|
||||||
|
{
|
||||||
|
var panelLobby = UGUIBuilderUtils.CreatePanel(_parent, "Panel_Lobby", new Vector2(1100, 820));
|
||||||
|
panelLobby.SetActive(false);
|
||||||
|
|
||||||
|
var lobbyContainer = UGUIBuilderUtils.CreateVerticalGroup(
|
||||||
|
panelLobby.transform,
|
||||||
|
"Lobby_VLayout",
|
||||||
|
16f,
|
||||||
|
TextAnchor.UpperCenter,
|
||||||
|
new RectOffset(24, 24, 24, 24));
|
||||||
|
|
||||||
|
var lobbyHeader = UGUIBuilderUtils.CreateHorizontalGroup(
|
||||||
|
lobbyContainer.transform,
|
||||||
|
"Lobby_Header",
|
||||||
|
10f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(0, 0, 0, 10));
|
||||||
|
UGUIBuilderUtils.CreateText(lobbyHeader.transform, "Text_LobbyTitle", "MULTIPLAYER LOBBY", 36, TextAnchor.MiddleLeft, new Color(0.7f, 1f, 0.7f), FontStyles.Bold);
|
||||||
|
UGUIBuilderUtils.CreateText(lobbyHeader.transform, "Text_Status", "OFFLINE", 18, TextAnchor.MiddleRight, new Color(0.8f, 0.8f, 0.8f), FontStyles.Bold);
|
||||||
|
|
||||||
|
var codeGroup = UGUIBuilderUtils.CreateVerticalGroup(
|
||||||
|
lobbyContainer.transform,
|
||||||
|
"Lobby_CodeGroup",
|
||||||
|
8f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(10, 10, 10, 10));
|
||||||
|
UGUIBuilderUtils.CreateText(codeGroup.transform, "Text_LobbyCodeLabel", "LOBBY CODE", 16, TextAnchor.MiddleCenter, new Color(0.8f, 0.8f, 0.8f), FontStyles.Bold);
|
||||||
|
var codeRow = UGUIBuilderUtils.CreateHorizontalGroup(
|
||||||
|
codeGroup.transform,
|
||||||
|
"Lobby_CodeRow",
|
||||||
|
10f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(0, 0, 0, 0));
|
||||||
|
UGUIBuilderUtils.CreateText(codeRow.transform, "Text_LobbyCodeValue", "------", 44, TextAnchor.MiddleCenter, new Color(0.7f, 1f, 0.7f), FontStyles.Bold);
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(codeRow.transform, "Button_CopyCode", "COPY");
|
||||||
|
UGUIBuilderUtils.CreateText(codeGroup.transform, "Text_LobbyCodeHint", "Share this code with friends to invite them", 12, TextAnchor.MiddleCenter, new Color(0.8f, 0.8f, 0.8f), FontStyles.Normal);
|
||||||
|
|
||||||
|
var tabs = UGUIBuilderUtils.CreateHorizontalGroup(
|
||||||
|
lobbyContainer.transform,
|
||||||
|
"Lobby_Tabs",
|
||||||
|
0f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(0, 0, 0, 0));
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(tabs.transform, "Button_HostTab", "HOST LOBBY");
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(tabs.transform, "Button_JoinTab", "JOIN LOBBY");
|
||||||
|
|
||||||
|
var joinGroup = UGUIBuilderUtils.CreateVerticalGroup(
|
||||||
|
lobbyContainer.transform,
|
||||||
|
"Group_Join",
|
||||||
|
10f,
|
||||||
|
TextAnchor.UpperCenter,
|
||||||
|
new RectOffset(10, 10, 10, 10));
|
||||||
|
var joinRow = UGUIBuilderUtils.CreateHorizontalGroup(
|
||||||
|
joinGroup.transform,
|
||||||
|
"Join_Row",
|
||||||
|
10f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(0, 0, 0, 0));
|
||||||
|
UGUIBuilderUtils.CreateInputField(joinRow.transform, "Input_LobbyCode", "Enter 6-digit code...");
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(joinGroup.transform, "Button_Connect", "CONNECT");
|
||||||
|
|
||||||
|
var hostGroup = UGUIBuilderUtils.CreateVerticalGroup(
|
||||||
|
lobbyContainer.transform,
|
||||||
|
"Group_Host",
|
||||||
|
10f,
|
||||||
|
TextAnchor.UpperCenter,
|
||||||
|
new RectOffset(10, 10, 10, 10));
|
||||||
|
UGUIBuilderUtils.CreateDropdown(hostGroup.transform, "Dropdown_MaxPlayers", new[] { "2", "3", "4", "8" });
|
||||||
|
UGUIBuilderUtils.CreateToggle(hostGroup.transform, "Toggle_PublicLobby", "Public", true);
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(hostGroup.transform, "Button_CreateLobby", "CREATE LOBBY");
|
||||||
|
|
||||||
|
var playersHeader = UGUIBuilderUtils.CreateHorizontalGroup(
|
||||||
|
lobbyContainer.transform,
|
||||||
|
"Players_Header",
|
||||||
|
10f,
|
||||||
|
TextAnchor.MiddleLeft,
|
||||||
|
new RectOffset(0, 0, 0, 0));
|
||||||
|
UGUIBuilderUtils.CreateText(playersHeader.transform, "Text_PlayersTitle", "PLAYERS", 20, TextAnchor.MiddleLeft, Color.white, FontStyles.Bold);
|
||||||
|
UGUIBuilderUtils.CreateText(playersHeader.transform, "Text_PlayerCount", "0/4", 18, TextAnchor.MiddleRight, new Color(0.7f, 1f, 0.7f), FontStyles.Bold);
|
||||||
|
|
||||||
|
var scroll = UGUIBuilderUtils.CreateScrollList(
|
||||||
|
lobbyContainer.transform,
|
||||||
|
out var playersContent,
|
||||||
|
"Scroll_Players",
|
||||||
|
"Viewport",
|
||||||
|
"Content_PlayersList");
|
||||||
|
UGUIBuilderUtils.CreateText(lobbyContainer.transform, "Empty_Players", "Waiting for players...", 16, TextAnchor.MiddleCenter, new Color(0.8f, 0.8f, 0.8f), FontStyles.Italic);
|
||||||
|
|
||||||
|
var template = new GameObject("PlayerItemTemplate", typeof(RectTransform), typeof(HorizontalLayoutGroup));
|
||||||
|
template.transform.SetParent(playersContent, false);
|
||||||
|
var hlg = template.GetComponent<HorizontalLayoutGroup>();
|
||||||
|
hlg.childAlignment = TextAnchor.MiddleLeft;
|
||||||
|
hlg.spacing = 12;
|
||||||
|
hlg.childControlWidth = false;
|
||||||
|
hlg.childForceExpandWidth = true;
|
||||||
|
var avatar = UGUIBuilderUtils.CreateImage(template.transform, "Image_Avatar", new Color(0.3f, 0.6f, 0.3f));
|
||||||
|
var name = UGUIBuilderUtils.CreateText(template.transform, "Text_PlayerName", "Player", 18, TextAnchor.MiddleLeft, Color.white, FontStyles.Bold);
|
||||||
|
var status = UGUIBuilderUtils.CreateText(template.transform, "Text_PlayerStatus", "NOT READY", 14, TextAnchor.MiddleRight, new Color(0.8f, 0.8f, 0.8f), FontStyles.Bold);
|
||||||
|
((RectTransform)avatar.transform).sizeDelta = new Vector2(40, 40);
|
||||||
|
template.SetActive(false);
|
||||||
|
|
||||||
|
var hostControls = UGUIBuilderUtils.CreateHorizontalGroup(
|
||||||
|
lobbyContainer.transform,
|
||||||
|
"Host_Controls",
|
||||||
|
10f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(0, 0, 0, 0));
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(hostControls.transform, "Button_InviteFriends", "INVITE FRIENDS");
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(hostControls.transform, "Button_KickSelected", "KICK SELECTED");
|
||||||
|
|
||||||
|
var friendsOverlay = new GameObject("Panel_Friends", typeof(RectTransform), typeof(Image));
|
||||||
|
friendsOverlay.transform.SetParent(panelLobby.transform, false);
|
||||||
|
var ovRT = (RectTransform)friendsOverlay.transform;
|
||||||
|
ovRT.anchorMin = Vector2.zero;
|
||||||
|
ovRT.anchorMax = Vector2.one;
|
||||||
|
ovRT.offsetMin = Vector2.zero;
|
||||||
|
ovRT.offsetMax = Vector2.zero;
|
||||||
|
var ovImg = friendsOverlay.GetComponent<Image>();
|
||||||
|
ovImg.color = new Color(0, 0, 0, 0.55f);
|
||||||
|
friendsOverlay.SetActive(false);
|
||||||
|
|
||||||
|
var closeBg = new GameObject("Button_CloseFriendsOverlay", typeof(RectTransform), typeof(Image), typeof(Button));
|
||||||
|
closeBg.transform.SetParent(friendsOverlay.transform, false);
|
||||||
|
var closeBgRT = (RectTransform)closeBg.transform;
|
||||||
|
closeBgRT.anchorMin = Vector2.zero;
|
||||||
|
closeBgRT.anchorMax = Vector2.one;
|
||||||
|
closeBgRT.offsetMin = Vector2.zero;
|
||||||
|
closeBgRT.offsetMax = Vector2.zero;
|
||||||
|
var closeBgImg = closeBg.GetComponent<Image>();
|
||||||
|
closeBgImg.color = new Color(0, 0, 0, 0);
|
||||||
|
|
||||||
|
var friendsWindow = UGUIBuilderUtils.CreatePanel(friendsOverlay.transform, "Friends_Window", new Vector2(900, 420));
|
||||||
|
var friendsV = UGUIBuilderUtils.CreateVerticalGroup(
|
||||||
|
friendsWindow.transform,
|
||||||
|
"Friends_VLayout",
|
||||||
|
8f,
|
||||||
|
TextAnchor.UpperCenter,
|
||||||
|
new RectOffset(16, 16, 16, 16));
|
||||||
|
UGUIBuilderUtils.CreateText(friendsV.transform, "Text_FriendsTitle", "INVITE FRIENDS", 24, TextAnchor.MiddleCenter, Color.white, FontStyles.Bold);
|
||||||
|
UGUIBuilderUtils.CreateText(friendsV.transform, "Text_FriendsHint", "Select a friend to send a Steam invite.", 12, TextAnchor.MiddleCenter, new Color(0.8f, 0.8f, 0.8f), FontStyles.Normal);
|
||||||
|
UGUIBuilderUtils.CreateScrollList(friendsV.transform, out var friendsContent, "Scroll_Friends", "Viewport", "Content_FriendsList");
|
||||||
|
var vlgFriends = friendsContent.GetComponent<VerticalLayoutGroup>();
|
||||||
|
if (vlgFriends)
|
||||||
|
{
|
||||||
|
Object.DestroyImmediate(vlgFriends);
|
||||||
|
}
|
||||||
|
var gridFriends = friendsContent.gameObject.AddComponent<GridLayoutGroup>();
|
||||||
|
gridFriends.cellSize = new Vector2(72, 72);
|
||||||
|
gridFriends.spacing = new Vector2(10, 10);
|
||||||
|
gridFriends.startAxis = GridLayoutGroup.Axis.Horizontal;
|
||||||
|
var csfFriends = friendsContent.GetComponent<ContentSizeFitter>();
|
||||||
|
if (csfFriends == null)
|
||||||
|
{
|
||||||
|
csfFriends = friendsContent.gameObject.AddComponent<ContentSizeFitter>();
|
||||||
|
}
|
||||||
|
csfFriends.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
UGUIBuilderUtils.CreateText(friendsV.transform, "Empty_Friends", "No friends found.", 14, TextAnchor.MiddleCenter, new Color(0.8f, 0.8f, 0.8f), FontStyles.Italic);
|
||||||
|
var friendsFooter = UGUIBuilderUtils.CreateHorizontalGroup(
|
||||||
|
friendsV.transform,
|
||||||
|
"Friends_Footer",
|
||||||
|
8f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(0, 0, 0, 0));
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(friendsFooter.transform, "Button_BackFromFriends", "BACK");
|
||||||
|
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(lobbyContainer.transform, "Button_ToggleReady", "TOGGLE READY");
|
||||||
|
|
||||||
|
var footer = UGUIBuilderUtils.CreateHorizontalGroup(
|
||||||
|
lobbyContainer.transform,
|
||||||
|
"Lobby_Footer",
|
||||||
|
10f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(0, 0, 0, 0));
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(footer.transform, "Button_StartGame", "START GAME");
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(footer.transform, "Button_LeaveLobby", "LEAVE LOBBY");
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(footer.transform, "Button_BackFromLobby", "BACK TO MENU");
|
||||||
|
|
||||||
|
return panelLobby;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
2
Editor/LobbyPanelBuilder.cs.meta
Normal file
2
Editor/LobbyPanelBuilder.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 46d584193d4545f45b0a8a344fa11093
|
||||||
40
Editor/MainMenuPanelBuilder.cs
Normal file
40
Editor/MainMenuPanelBuilder.cs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#if UNITY_EDITOR
|
||||||
|
using TMPro;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
namespace MegaKoop.EditorTools
|
||||||
|
{
|
||||||
|
internal sealed class MainMenuPanelBuilder
|
||||||
|
{
|
||||||
|
private readonly Transform _parent;
|
||||||
|
|
||||||
|
internal MainMenuPanelBuilder(Transform parent)
|
||||||
|
{
|
||||||
|
_parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal GameObject Build()
|
||||||
|
{
|
||||||
|
var panelMain = UGUIBuilderUtils.CreatePanel(_parent, "Panel_MainMenu", new Vector2(900, 800));
|
||||||
|
|
||||||
|
var mainContainer = UGUIBuilderUtils.CreateVerticalGroup(
|
||||||
|
panelMain.transform,
|
||||||
|
"Main_VLayout",
|
||||||
|
20f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(30, 30, 30, 30));
|
||||||
|
|
||||||
|
UGUIBuilderUtils.CreateText(mainContainer.transform, "Text_Title", "MEGA KOOP", 70, TextAnchor.MiddleCenter, Color.white, FontStyles.Bold);
|
||||||
|
UGUIBuilderUtils.CreateText(mainContainer.transform, "Text_Subtitle", "CO-OP ADVENTURE", 20, TextAnchor.MiddleCenter, new Color(0.8f, 0.8f, 0.8f), FontStyles.Normal);
|
||||||
|
UGUIBuilderUtils.CreateSpacer(mainContainer.transform, 20f);
|
||||||
|
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(mainContainer.transform, "Button_Multiplayer", "MULTIPLAYER");
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(mainContainer.transform, "Button_Settings", "SETTINGS");
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(mainContainer.transform, "Button_Quit", "QUIT GAME", isDanger: true);
|
||||||
|
|
||||||
|
return panelMain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
2
Editor/MainMenuPanelBuilder.cs.meta
Normal file
2
Editor/MainMenuPanelBuilder.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c43d178d57dd2ae4db117649aad9e5b7
|
||||||
67
Editor/SettingsPanelBuilder.cs
Normal file
67
Editor/SettingsPanelBuilder.cs
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#if UNITY_EDITOR
|
||||||
|
using TMPro;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
namespace MegaKoop.EditorTools
|
||||||
|
{
|
||||||
|
internal sealed class SettingsPanelBuilder
|
||||||
|
{
|
||||||
|
private readonly Transform _parent;
|
||||||
|
|
||||||
|
internal SettingsPanelBuilder(Transform parent)
|
||||||
|
{
|
||||||
|
_parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal GameObject Build()
|
||||||
|
{
|
||||||
|
var panelSettings = UGUIBuilderUtils.CreatePanel(_parent, "Panel_Settings", new Vector2(900, 800));
|
||||||
|
panelSettings.SetActive(false);
|
||||||
|
|
||||||
|
var settingsContainer = UGUIBuilderUtils.CreateVerticalGroup(
|
||||||
|
panelSettings.transform,
|
||||||
|
"Settings_VLayout",
|
||||||
|
16f,
|
||||||
|
TextAnchor.UpperCenter,
|
||||||
|
new RectOffset(30, 30, 30, 30));
|
||||||
|
|
||||||
|
UGUIBuilderUtils.CreateText(settingsContainer.transform, "Text_SettingsTitle", "SETTINGS", 48, TextAnchor.MiddleCenter, Color.white, FontStyles.Bold);
|
||||||
|
UGUIBuilderUtils.CreateSpacer(settingsContainer.transform, 10f);
|
||||||
|
|
||||||
|
var gfxGroup = UGUIBuilderUtils.CreateVerticalGroup(
|
||||||
|
settingsContainer.transform,
|
||||||
|
"Graphics_Group",
|
||||||
|
10f,
|
||||||
|
TextAnchor.UpperLeft,
|
||||||
|
new RectOffset(10, 10, 10, 10));
|
||||||
|
UGUIBuilderUtils.CreateText(gfxGroup.transform, "Text_Graphics", "Graphics", 24, TextAnchor.MiddleLeft, Color.white, FontStyles.Bold);
|
||||||
|
UGUIBuilderUtils.CreateDropdown(gfxGroup.transform, "Dropdown_Quality", new[] { "Low", "Medium", "High", "Ultra" });
|
||||||
|
UGUIBuilderUtils.CreateToggle(gfxGroup.transform, "Toggle_Fullscreen", "Fullscreen", true);
|
||||||
|
UGUIBuilderUtils.CreateDropdown(gfxGroup.transform, "Dropdown_Resolution", new[] { "1280x720", "1920x1080", "2560x1440", "3840x2160" });
|
||||||
|
|
||||||
|
var audioGroup = UGUIBuilderUtils.CreateVerticalGroup(
|
||||||
|
settingsContainer.transform,
|
||||||
|
"Audio_Group",
|
||||||
|
10f,
|
||||||
|
TextAnchor.UpperLeft,
|
||||||
|
new RectOffset(10, 10, 10, 10));
|
||||||
|
UGUIBuilderUtils.CreateText(audioGroup.transform, "Text_Audio", "Audio", 24, TextAnchor.MiddleLeft, Color.white, FontStyles.Bold);
|
||||||
|
UGUIBuilderUtils.CreateLabeledSlider(audioGroup.transform, "Master Volume", "Slider_MasterVolume", 0, 100, 100);
|
||||||
|
UGUIBuilderUtils.CreateLabeledSlider(audioGroup.transform, "Music Volume", "Slider_MusicVolume", 0, 100, 80);
|
||||||
|
UGUIBuilderUtils.CreateLabeledSlider(audioGroup.transform, "SFX Volume", "Slider_SFXVolume", 0, 100, 100);
|
||||||
|
|
||||||
|
var buttonsRow = UGUIBuilderUtils.CreateHorizontalGroup(
|
||||||
|
settingsContainer.transform,
|
||||||
|
"Settings_Buttons",
|
||||||
|
10f,
|
||||||
|
TextAnchor.MiddleCenter,
|
||||||
|
new RectOffset(0, 0, 0, 0));
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(buttonsRow.transform, "Button_ApplySettings", "APPLY");
|
||||||
|
UGUIBuilderUtils.CreateMenuButton(buttonsRow.transform, "Button_BackFromSettings", "BACK");
|
||||||
|
|
||||||
|
return panelSettings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
2
Editor/SettingsPanelBuilder.cs.meta
Normal file
2
Editor/SettingsPanelBuilder.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1f247737932b5ac4f83890f357d265f6
|
||||||
432
Editor/UGUIBuilderUtils.cs
Normal file
432
Editor/UGUIBuilderUtils.cs
Normal file
@@ -0,0 +1,432 @@
|
|||||||
|
#if UNITY_EDITOR
|
||||||
|
using System.Linq;
|
||||||
|
using TMPro;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
namespace MegaKoop.EditorTools
|
||||||
|
{
|
||||||
|
internal static class UGUIBuilderUtils
|
||||||
|
{
|
||||||
|
internal static GameObject CreatePanel(Transform parent, string name, Vector2 size)
|
||||||
|
{
|
||||||
|
var go = new GameObject(name, typeof(RectTransform), typeof(Image));
|
||||||
|
go.transform.SetParent(parent, false);
|
||||||
|
var rt = (RectTransform)go.transform;
|
||||||
|
rt.anchorMin = rt.anchorMax = new Vector2(0.5f, 0.5f);
|
||||||
|
rt.pivot = new Vector2(0.5f, 0.5f);
|
||||||
|
rt.sizeDelta = size;
|
||||||
|
var img = go.GetComponent<Image>();
|
||||||
|
img.color = new Color(0.13f, 0.13f, 0.13f, 0.95f);
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static GameObject CreateVerticalGroup(Transform parent, string name, float spacing, TextAnchor align, RectOffset padding)
|
||||||
|
{
|
||||||
|
var go = new GameObject(name, typeof(RectTransform), typeof(VerticalLayoutGroup), typeof(ContentSizeFitter));
|
||||||
|
go.transform.SetParent(parent, false);
|
||||||
|
var rt = (RectTransform)go.transform;
|
||||||
|
rt.anchorMin = new Vector2(0, 0);
|
||||||
|
rt.anchorMax = new Vector2(1, 1);
|
||||||
|
rt.offsetMin = Vector2.zero;
|
||||||
|
rt.offsetMax = Vector2.zero;
|
||||||
|
var vlg = go.GetComponent<VerticalLayoutGroup>();
|
||||||
|
vlg.spacing = spacing;
|
||||||
|
vlg.childAlignment = align;
|
||||||
|
vlg.padding = padding;
|
||||||
|
vlg.childForceExpandWidth = true;
|
||||||
|
vlg.childControlWidth = true;
|
||||||
|
vlg.childControlHeight = false;
|
||||||
|
var fitter = go.GetComponent<ContentSizeFitter>();
|
||||||
|
fitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
fitter.horizontalFit = ContentSizeFitter.FitMode.Unconstrained;
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static GameObject CreateHorizontalGroup(Transform parent, string name, float spacing, TextAnchor align, RectOffset padding)
|
||||||
|
{
|
||||||
|
var go = new GameObject(name, typeof(RectTransform), typeof(HorizontalLayoutGroup));
|
||||||
|
go.transform.SetParent(parent, false);
|
||||||
|
var rt = (RectTransform)go.transform;
|
||||||
|
rt.anchorMin = new Vector2(0, 0);
|
||||||
|
rt.anchorMax = new Vector2(1, 0);
|
||||||
|
rt.pivot = new Vector2(0.5f, 0.5f);
|
||||||
|
rt.sizeDelta = new Vector2(0, 60);
|
||||||
|
var hlg = go.GetComponent<HorizontalLayoutGroup>();
|
||||||
|
hlg.spacing = spacing;
|
||||||
|
hlg.childAlignment = align;
|
||||||
|
hlg.padding = padding;
|
||||||
|
hlg.childControlWidth = true;
|
||||||
|
hlg.childForceExpandWidth = true;
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static GameObject CreateText(Transform parent, string name, string text, int fontSize, TextAnchor anchor, Color color, FontStyles fontStyle)
|
||||||
|
{
|
||||||
|
var go = new GameObject(name, typeof(RectTransform), typeof(TextMeshProUGUI), typeof(LayoutElement));
|
||||||
|
go.transform.SetParent(parent, false);
|
||||||
|
var tmp = go.GetComponent<TextMeshProUGUI>();
|
||||||
|
tmp.text = text;
|
||||||
|
tmp.fontSize = fontSize;
|
||||||
|
tmp.color = color;
|
||||||
|
tmp.alignment = MapAlignment(anchor);
|
||||||
|
tmp.fontStyle = fontStyle;
|
||||||
|
tmp.enableWordWrapping = false;
|
||||||
|
tmp.raycastTarget = false;
|
||||||
|
if (TMP_Settings.defaultFontAsset != null)
|
||||||
|
{
|
||||||
|
tmp.font = TMP_Settings.defaultFontAsset;
|
||||||
|
}
|
||||||
|
var le = go.GetComponent<LayoutElement>();
|
||||||
|
le.minHeight = Mathf.Max(24, fontSize + 12);
|
||||||
|
var rt = (RectTransform)go.transform;
|
||||||
|
rt.sizeDelta = new Vector2(0, fontSize + 20);
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static TextAlignmentOptions MapAlignment(TextAnchor anchor)
|
||||||
|
{
|
||||||
|
switch (anchor)
|
||||||
|
{
|
||||||
|
case TextAnchor.UpperLeft: return TextAlignmentOptions.TopLeft;
|
||||||
|
case TextAnchor.UpperCenter: return TextAlignmentOptions.Top;
|
||||||
|
case TextAnchor.UpperRight: return TextAlignmentOptions.TopRight;
|
||||||
|
case TextAnchor.MiddleLeft: return TextAlignmentOptions.MidlineLeft;
|
||||||
|
case TextAnchor.MiddleCenter: return TextAlignmentOptions.Midline;
|
||||||
|
case TextAnchor.MiddleRight: return TextAlignmentOptions.MidlineRight;
|
||||||
|
case TextAnchor.LowerLeft: return TextAlignmentOptions.BottomLeft;
|
||||||
|
case TextAnchor.LowerCenter: return TextAlignmentOptions.Bottom;
|
||||||
|
case TextAnchor.LowerRight: return TextAlignmentOptions.BottomRight;
|
||||||
|
default: return TextAlignmentOptions.Center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static GameObject CreateMenuButton(Transform parent, string name, string label, bool isDanger = false)
|
||||||
|
{
|
||||||
|
var go = new GameObject(name, typeof(RectTransform), typeof(Image), typeof(Button));
|
||||||
|
go.transform.SetParent(parent, false);
|
||||||
|
var img = go.GetComponent<Image>();
|
||||||
|
img.color = isDanger ? new Color(0.5f, 0.15f, 0.15f, 0.9f) : new Color(0.25f, 0.5f, 0.25f, 0.9f);
|
||||||
|
var rt = (RectTransform)go.transform;
|
||||||
|
rt.sizeDelta = new Vector2(0, 48);
|
||||||
|
var leBtn = go.AddComponent<LayoutElement>();
|
||||||
|
leBtn.flexibleWidth = 1;
|
||||||
|
leBtn.minHeight = 48;
|
||||||
|
var text = CreateText(go.transform, "Text", label, 20, TextAnchor.MiddleCenter, Color.white, FontStyles.Bold);
|
||||||
|
var textRT = (RectTransform)text.transform;
|
||||||
|
textRT.anchorMin = new Vector2(0, 0);
|
||||||
|
textRT.anchorMax = new Vector2(1, 1);
|
||||||
|
textRT.offsetMin = Vector2.zero;
|
||||||
|
textRT.offsetMax = Vector2.zero;
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static GameObject CreateInputField(Transform parent, string name, string placeholder)
|
||||||
|
{
|
||||||
|
var go = new GameObject(name, typeof(RectTransform), typeof(Image), typeof(TMP_InputField));
|
||||||
|
go.transform.SetParent(parent, false);
|
||||||
|
var img = go.GetComponent<Image>();
|
||||||
|
img.color = new Color(0.1f, 0.1f, 0.1f, 0.9f);
|
||||||
|
var rt = (RectTransform)go.transform;
|
||||||
|
rt.sizeDelta = new Vector2(600, 50);
|
||||||
|
var viewport = new GameObject("TextViewport", typeof(RectTransform));
|
||||||
|
viewport.transform.SetParent(go.transform, false);
|
||||||
|
var viewportRT = (RectTransform)viewport.transform;
|
||||||
|
viewportRT.anchorMin = new Vector2(0, 0);
|
||||||
|
viewportRT.anchorMax = new Vector2(1, 1);
|
||||||
|
viewportRT.offsetMin = new Vector2(10, 6);
|
||||||
|
viewportRT.offsetMax = new Vector2(-10, -6);
|
||||||
|
var text = CreateText(viewport.transform, "Text", string.Empty, 20, TextAnchor.MiddleLeft, Color.white, FontStyles.Normal);
|
||||||
|
var placeholderGO = CreateText(viewport.transform, "Placeholder", placeholder, 18, TextAnchor.MiddleLeft, new Color(0.7f, 0.7f, 0.7f), FontStyles.Italic);
|
||||||
|
var input = go.GetComponent<TMP_InputField>();
|
||||||
|
input.textViewport = viewportRT;
|
||||||
|
input.textComponent = text.GetComponent<TextMeshProUGUI>();
|
||||||
|
input.placeholder = placeholderGO.GetComponent<TextMeshProUGUI>();
|
||||||
|
var tRT = (RectTransform)text.transform;
|
||||||
|
tRT.anchorMin = new Vector2(0, 0);
|
||||||
|
tRT.anchorMax = new Vector2(1, 1);
|
||||||
|
tRT.offsetMin = new Vector2(10, 0);
|
||||||
|
tRT.offsetMax = new Vector2(-10, 0);
|
||||||
|
var pRT = (RectTransform)placeholderGO.transform;
|
||||||
|
pRT.anchorMin = new Vector2(0, 0);
|
||||||
|
pRT.anchorMax = new Vector2(1, 1);
|
||||||
|
pRT.offsetMin = new Vector2(10, 0);
|
||||||
|
pRT.offsetMax = new Vector2(-10, 0);
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static GameObject CreateDropdown(Transform parent, string name, string[] options)
|
||||||
|
{
|
||||||
|
var go = new GameObject(name, typeof(RectTransform), typeof(Image), typeof(TMP_Dropdown));
|
||||||
|
go.transform.SetParent(parent, false);
|
||||||
|
var img = go.GetComponent<Image>();
|
||||||
|
img.color = new Color(0.2f, 0.2f, 0.2f, 0.9f);
|
||||||
|
var rt = (RectTransform)go.transform;
|
||||||
|
rt.sizeDelta = new Vector2(600, 50);
|
||||||
|
|
||||||
|
var caption = CreateText(go.transform, "Label", options.FirstOrDefault() ?? "Option", 18, TextAnchor.MiddleLeft, Color.white, FontStyles.Normal);
|
||||||
|
var arrow = CreateText(go.transform, "Arrow", "▼", 18, TextAnchor.MiddleRight, Color.white, FontStyles.Bold);
|
||||||
|
|
||||||
|
var template = new GameObject("Template", typeof(RectTransform), typeof(Image), typeof(ScrollRect));
|
||||||
|
template.transform.SetParent(go.transform, false);
|
||||||
|
var templateRT = (RectTransform)template.transform;
|
||||||
|
templateRT.anchorMin = new Vector2(0, 0);
|
||||||
|
templateRT.anchorMax = new Vector2(1, 0);
|
||||||
|
templateRT.pivot = new Vector2(0.5f, 1f);
|
||||||
|
templateRT.sizeDelta = new Vector2(0, 220);
|
||||||
|
template.SetActive(false);
|
||||||
|
var templateImg = template.GetComponent<Image>();
|
||||||
|
templateImg.color = new Color(0.1f, 0.1f, 0.1f, 0.95f);
|
||||||
|
|
||||||
|
var tplCanvas = template.GetComponent<Canvas>();
|
||||||
|
if (tplCanvas == null)
|
||||||
|
{
|
||||||
|
tplCanvas = template.AddComponent<Canvas>();
|
||||||
|
}
|
||||||
|
tplCanvas.overrideSorting = true;
|
||||||
|
tplCanvas.sortingOrder = 5000;
|
||||||
|
if (!template.GetComponent<GraphicRaycaster>())
|
||||||
|
{
|
||||||
|
template.AddComponent<GraphicRaycaster>();
|
||||||
|
}
|
||||||
|
|
||||||
|
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<Image>();
|
||||||
|
vImg.color = new Color(0, 0, 0, 0.2f);
|
||||||
|
vImg.raycastTarget = false;
|
||||||
|
var mask = viewport.GetComponent<Mask>();
|
||||||
|
mask.showMaskGraphic = false;
|
||||||
|
|
||||||
|
var content = new GameObject("Content", typeof(RectTransform), typeof(VerticalLayoutGroup));
|
||||||
|
content.transform.SetParent(viewport.transform, false);
|
||||||
|
var contentRT = (RectTransform)content.transform;
|
||||||
|
contentRT.anchorMin = new Vector2(0, 1);
|
||||||
|
contentRT.anchorMax = new Vector2(1, 1);
|
||||||
|
contentRT.pivot = new Vector2(0.5f, 1f);
|
||||||
|
var vlg = content.GetComponent<VerticalLayoutGroup>();
|
||||||
|
vlg.spacing = 4;
|
||||||
|
vlg.childForceExpandWidth = true;
|
||||||
|
vlg.childControlHeight = true;
|
||||||
|
|
||||||
|
var item = new GameObject("Item", typeof(RectTransform), typeof(Toggle));
|
||||||
|
item.transform.SetParent(content.transform, false);
|
||||||
|
var itemRT = (RectTransform)item.transform;
|
||||||
|
itemRT.sizeDelta = new Vector2(0, 30);
|
||||||
|
var itemBG = new GameObject("Item Background", typeof(RectTransform), typeof(Image));
|
||||||
|
itemBG.transform.SetParent(item.transform, false);
|
||||||
|
var itemBGImg = itemBG.GetComponent<Image>();
|
||||||
|
itemBGImg.color = new Color(0.2f, 0.2f, 0.2f, 0.9f);
|
||||||
|
var itemCheck = new GameObject("Item Checkmark", typeof(RectTransform), typeof(Image));
|
||||||
|
itemCheck.transform.SetParent(itemBG.transform, false);
|
||||||
|
var itemCheckImg = itemCheck.GetComponent<Image>();
|
||||||
|
itemCheckImg.color = new Color(0.7f, 1f, 0.7f, 1f);
|
||||||
|
var itemLabelGO = CreateText(item.transform, "Item Label", "Option", 18, TextAnchor.MiddleLeft, Color.white, FontStyles.Normal);
|
||||||
|
|
||||||
|
var bgRT = (RectTransform)itemBG.transform;
|
||||||
|
bgRT.anchorMin = new Vector2(0, 0);
|
||||||
|
bgRT.anchorMax = new Vector2(1, 1);
|
||||||
|
bgRT.offsetMin = Vector2.zero;
|
||||||
|
bgRT.offsetMax = Vector2.zero;
|
||||||
|
var ckRT = (RectTransform)itemCheck.transform;
|
||||||
|
ckRT.anchorMin = new Vector2(0, 0.5f);
|
||||||
|
ckRT.anchorMax = new Vector2(0, 0.5f);
|
||||||
|
ckRT.pivot = new Vector2(0, 0.5f);
|
||||||
|
ckRT.sizeDelta = new Vector2(18, 18);
|
||||||
|
ckRT.anchoredPosition = new Vector2(6, 0);
|
||||||
|
var itemLabelRT = (RectTransform)itemLabelGO.transform;
|
||||||
|
itemLabelRT.anchorMin = new Vector2(0, 0);
|
||||||
|
itemLabelRT.anchorMax = new Vector2(1, 1);
|
||||||
|
itemLabelRT.offsetMin = new Vector2(28, 0);
|
||||||
|
itemLabelRT.offsetMax = new Vector2(-6, 0);
|
||||||
|
|
||||||
|
var toggle = item.GetComponent<Toggle>();
|
||||||
|
toggle.targetGraphic = itemBGImg;
|
||||||
|
toggle.graphic = itemCheckImg;
|
||||||
|
|
||||||
|
var dropdown = go.GetComponent<TMP_Dropdown>();
|
||||||
|
dropdown.template = templateRT;
|
||||||
|
dropdown.captionText = caption.GetComponent<TextMeshProUGUI>();
|
||||||
|
dropdown.itemText = itemLabelGO.GetComponent<TextMeshProUGUI>();
|
||||||
|
dropdown.options = options.Select(o => new TMP_Dropdown.OptionData(o)).ToList();
|
||||||
|
dropdown.alphaFadeSpeed = 0.15f;
|
||||||
|
dropdown.RefreshShownValue();
|
||||||
|
|
||||||
|
var scrollRect = template.GetComponent<ScrollRect>();
|
||||||
|
scrollRect.viewport = viewportRT;
|
||||||
|
scrollRect.content = (RectTransform)content.transform;
|
||||||
|
scrollRect.horizontal = false;
|
||||||
|
scrollRect.vertical = true;
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal 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>();
|
||||||
|
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<Image>();
|
||||||
|
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<Image>();
|
||||||
|
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<Image>();
|
||||||
|
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<RectTransform>();
|
||||||
|
slider.handleRect = handle.GetComponent<RectTransform>();
|
||||||
|
slider.targetGraphic = handleImg;
|
||||||
|
slider.direction = Slider.Direction.LeftToRight;
|
||||||
|
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static GameObject CreateToggle(Transform parent, string name, string labelText, bool initial)
|
||||||
|
{
|
||||||
|
var go = new GameObject(name, typeof(RectTransform), typeof(Toggle));
|
||||||
|
go.transform.SetParent(parent, false);
|
||||||
|
var bg = CreateImage(go.transform, "Background", new Color(0.2f, 0.2f, 0.2f));
|
||||||
|
var check = CreateImage(bg.transform, "Checkmark", new Color(0.7f, 1f, 0.7f));
|
||||||
|
var label = CreateText(go.transform, "Label", labelText, 18, TextAnchor.MiddleLeft, Color.white, FontStyles.Normal);
|
||||||
|
var toggle = go.GetComponent<Toggle>();
|
||||||
|
toggle.isOn = initial;
|
||||||
|
toggle.graphic = check.GetComponent<Image>();
|
||||||
|
toggle.targetGraphic = bg.GetComponent<Image>();
|
||||||
|
var rt = (RectTransform)go.transform;
|
||||||
|
rt.sizeDelta = new Vector2(600, 40);
|
||||||
|
var bgRT = (RectTransform)bg.transform;
|
||||||
|
bgRT.anchorMin = new Vector2(0, 0.5f);
|
||||||
|
bgRT.anchorMax = new Vector2(0, 0.5f);
|
||||||
|
bgRT.pivot = new Vector2(0, 0.5f);
|
||||||
|
bgRT.sizeDelta = new Vector2(24, 24);
|
||||||
|
var checkRT = (RectTransform)check.transform;
|
||||||
|
checkRT.anchorMin = checkRT.anchorMax = new Vector2(0.5f, 0.5f);
|
||||||
|
checkRT.sizeDelta = new Vector2(16, 16);
|
||||||
|
var labelRT = (RectTransform)label.transform;
|
||||||
|
labelRT.anchorMin = new Vector2(0, 0);
|
||||||
|
labelRT.anchorMax = new Vector2(1, 1);
|
||||||
|
labelRT.offsetMin = new Vector2(34, 0);
|
||||||
|
labelRT.offsetMax = new Vector2(0, 0);
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static GameObject CreateImage(Transform parent, string name, Color color)
|
||||||
|
{
|
||||||
|
var go = new GameObject(name, typeof(RectTransform), typeof(Image));
|
||||||
|
go.transform.SetParent(parent, false);
|
||||||
|
var img = go.GetComponent<Image>();
|
||||||
|
img.color = color;
|
||||||
|
return go;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void CreateSpacer(Transform parent, float height)
|
||||||
|
{
|
||||||
|
var spacer = new GameObject("Spacer", typeof(RectTransform));
|
||||||
|
spacer.transform.SetParent(parent, false);
|
||||||
|
var rt = (RectTransform)spacer.transform;
|
||||||
|
rt.sizeDelta = new Vector2(0, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static ScrollRect CreateScrollList(Transform parent, out Transform content, string scrollName, string viewportName, string contentName)
|
||||||
|
{
|
||||||
|
var scrollGO = new GameObject(scrollName, typeof(RectTransform), typeof(Image), typeof(ScrollRect));
|
||||||
|
scrollGO.transform.SetParent(parent, false);
|
||||||
|
var srt = (RectTransform)scrollGO.transform;
|
||||||
|
srt.sizeDelta = new Vector2(0, 240);
|
||||||
|
var img = scrollGO.GetComponent<Image>();
|
||||||
|
img.color = new Color(0, 0, 0, 0.3f);
|
||||||
|
var viewport = new GameObject(viewportName, typeof(RectTransform), typeof(Mask), typeof(Image));
|
||||||
|
viewport.transform.SetParent(scrollGO.transform, false);
|
||||||
|
var vImg = viewport.GetComponent<Image>();
|
||||||
|
vImg.color = new Color(0, 0, 0, 0.1f);
|
||||||
|
viewport.GetComponent<Mask>().showMaskGraphic = false;
|
||||||
|
var vprt = (RectTransform)viewport.transform;
|
||||||
|
vprt.anchorMin = new Vector2(0, 0);
|
||||||
|
vprt.anchorMax = new Vector2(1, 1);
|
||||||
|
vprt.offsetMin = Vector2.zero;
|
||||||
|
vprt.offsetMax = Vector2.zero;
|
||||||
|
var contentGO = new GameObject(contentName, typeof(RectTransform), typeof(VerticalLayoutGroup));
|
||||||
|
contentGO.transform.SetParent(viewport.transform, false);
|
||||||
|
var vlg = contentGO.GetComponent<VerticalLayoutGroup>();
|
||||||
|
vlg.spacing = 8;
|
||||||
|
vlg.childAlignment = TextAnchor.UpperLeft;
|
||||||
|
vlg.childForceExpandWidth = true;
|
||||||
|
var crt = (RectTransform)contentGO.transform;
|
||||||
|
crt.anchorMin = new Vector2(0, 1);
|
||||||
|
crt.anchorMax = new Vector2(1, 1);
|
||||||
|
crt.pivot = new Vector2(0.5f, 1);
|
||||||
|
crt.offsetMin = Vector2.zero;
|
||||||
|
crt.offsetMax = Vector2.zero;
|
||||||
|
var csf = contentGO.AddComponent<ContentSizeFitter>();
|
||||||
|
csf.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
||||||
|
content = contentGO.transform;
|
||||||
|
var scroll = scrollGO.GetComponent<ScrollRect>();
|
||||||
|
scroll.viewport = (RectTransform)viewport.transform;
|
||||||
|
scroll.content = (RectTransform)content;
|
||||||
|
scroll.horizontal = false;
|
||||||
|
scroll.vertical = true;
|
||||||
|
return scroll;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
2
Editor/UGUIBuilderUtils.cs.meta
Normal file
2
Editor/UGUIBuilderUtils.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2af2a4c51891b754d82ab14274d8146d
|
||||||
@@ -2,8 +2,6 @@
|
|||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
using TMPro;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace MegaKoop.EditorTools
|
namespace MegaKoop.EditorTools
|
||||||
{
|
{
|
||||||
@@ -124,140 +122,9 @@ namespace MegaKoop.EditorTools
|
|||||||
DestroyChildIfExists(canvas.transform, "Panel_Settings");
|
DestroyChildIfExists(canvas.transform, "Panel_Settings");
|
||||||
DestroyChildIfExists(canvas.transform, "Panel_Lobby");
|
DestroyChildIfExists(canvas.transform, "Panel_Lobby");
|
||||||
|
|
||||||
// Root panels
|
var mainPanel = new MainMenuPanelBuilder(canvas.transform).Build();
|
||||||
var panelMain = CreatePanel(canvas.transform, "Panel_MainMenu", new Vector2(900, 800));
|
var settingsPanel = new SettingsPanelBuilder(canvas.transform).Build();
|
||||||
var panelSettings = CreatePanel(canvas.transform, "Panel_Settings", new Vector2(900, 800));
|
var lobbyPanel = new LobbyPanelBuilder(canvas.transform).Build();
|
||||||
var panelLobby = CreatePanel(canvas.transform, "Panel_Lobby", new Vector2(1100, 820));
|
|
||||||
panelSettings.SetActive(false);
|
|
||||||
panelLobby.SetActive(false);
|
|
||||||
|
|
||||||
// Main Menu Content
|
|
||||||
var mainContainer = CreateVerticalGroup(panelMain.transform, "Main_VLayout", 20, TextAnchor.MiddleCenter, new RectOffset(30, 30, 30, 30));
|
|
||||||
CreateText(mainContainer.transform, "Text_Title", "MEGA KOOP", 70, TextAnchor.MiddleCenter, Color.white, FontStyles.Bold);
|
|
||||||
CreateText(mainContainer.transform, "Text_Subtitle", "CO-OP ADVENTURE", 20, TextAnchor.MiddleCenter, new Color(0.8f,0.8f,0.8f), FontStyles.Normal);
|
|
||||||
CreateSpacer(mainContainer.transform, 20);
|
|
||||||
|
|
||||||
CreateMenuButton(mainContainer.transform, "Button_Multiplayer", "MULTIPLAYER");
|
|
||||||
CreateMenuButton(mainContainer.transform, "Button_Settings", "SETTINGS");
|
|
||||||
CreateMenuButton(mainContainer.transform, "Button_Quit", "QUIT GAME", isDanger:true);
|
|
||||||
|
|
||||||
// Settings
|
|
||||||
var settingsContainer = CreateVerticalGroup(panelSettings.transform, "Settings_VLayout", 16, TextAnchor.UpperCenter, new RectOffset(30,30,30,30));
|
|
||||||
CreateText(settingsContainer.transform, "Text_SettingsTitle", "SETTINGS", 48, TextAnchor.MiddleCenter, Color.white, FontStyles.Bold);
|
|
||||||
CreateSpacer(settingsContainer.transform, 10);
|
|
||||||
|
|
||||||
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);
|
|
||||||
CreateUnityDropdown(gfxGroup.transform, "Dropdown_Quality", new string[]{"Low","Medium","High","Ultra"});
|
|
||||||
CreateToggle(gfxGroup.transform, "Toggle_Fullscreen", "Fullscreen", true);
|
|
||||||
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");
|
|
||||||
CreateMenuButton(settingsButtons.transform, "Button_BackFromSettings", "BACK");
|
|
||||||
|
|
||||||
// Lobby
|
|
||||||
var lobbyContainer = CreateVerticalGroup(panelLobby.transform, "Lobby_VLayout", 16, TextAnchor.UpperCenter, new RectOffset(24,24,24,24));
|
|
||||||
var lobbyHeader = CreateHorizontalGroup(lobbyContainer.transform, "Lobby_Header", 10, TextAnchor.MiddleCenter, new RectOffset(0,0,0,10));
|
|
||||||
CreateText(lobbyHeader.transform, "Text_LobbyTitle", "MULTIPLAYER LOBBY", 36, TextAnchor.MiddleLeft, new Color(0.7f,1f,0.7f), FontStyles.Bold);
|
|
||||||
CreateText(lobbyHeader.transform, "Text_Status", "OFFLINE", 18, TextAnchor.MiddleRight, new Color(0.8f,0.8f,0.8f), FontStyles.Bold);
|
|
||||||
|
|
||||||
// Lobby code area
|
|
||||||
var codeGroup = CreateVerticalGroup(lobbyContainer.transform, "Lobby_CodeGroup", 8, TextAnchor.MiddleCenter, new RectOffset(10,10,10,10));
|
|
||||||
CreateText(codeGroup.transform, "Text_LobbyCodeLabel", "LOBBY CODE", 16, TextAnchor.MiddleCenter, new Color(0.8f,0.8f,0.8f), FontStyles.Bold);
|
|
||||||
var codeRow = CreateHorizontalGroup(codeGroup.transform, "Lobby_CodeRow", 10, TextAnchor.MiddleCenter, new RectOffset(0,0,0,0));
|
|
||||||
CreateText(codeRow.transform, "Text_LobbyCodeValue", "------", 44, TextAnchor.MiddleCenter, new Color(0.7f,1f,0.7f), FontStyles.Bold);
|
|
||||||
CreateMenuButton(codeRow.transform, "Button_CopyCode", "COPY");
|
|
||||||
CreateText(codeGroup.transform, "Text_LobbyCodeHint", "Share this code with friends to invite them", 12, TextAnchor.MiddleCenter, new Color(0.8f,0.8f,0.8f), FontStyles.Normal);
|
|
||||||
|
|
||||||
// Tabs
|
|
||||||
var tabs = CreateHorizontalGroup(lobbyContainer.transform, "Lobby_Tabs", 0, TextAnchor.MiddleCenter, new RectOffset(0,0,0,0));
|
|
||||||
CreateMenuButton(tabs.transform, "Button_HostTab", "HOST LOBBY");
|
|
||||||
CreateMenuButton(tabs.transform, "Button_JoinTab", "JOIN LOBBY");
|
|
||||||
|
|
||||||
// Join content
|
|
||||||
var joinGroup = CreateVerticalGroup(lobbyContainer.transform, "Group_Join", 10, TextAnchor.UpperCenter, new RectOffset(10,10,10,10));
|
|
||||||
var joinRow = CreateHorizontalGroup(joinGroup.transform, "Join_Row", 10, TextAnchor.MiddleCenter, new RectOffset(0,0,0,0));
|
|
||||||
CreateInputField(joinRow.transform, "Input_LobbyCode", "Enter 6-digit code...");
|
|
||||||
CreateMenuButton(joinGroup.transform, "Button_Connect", "CONNECT");
|
|
||||||
|
|
||||||
// Host content
|
|
||||||
var hostGroup = CreateVerticalGroup(lobbyContainer.transform, "Group_Host", 10, TextAnchor.UpperCenter, new RectOffset(10,10,10,10));
|
|
||||||
CreateDropdown(hostGroup.transform, "Dropdown_MaxPlayers", new string[]{"2","3","4","8"});
|
|
||||||
CreateToggle(hostGroup.transform, "Toggle_PublicLobby", "Public", true);
|
|
||||||
CreateMenuButton(hostGroup.transform, "Button_CreateLobby", "CREATE LOBBY");
|
|
||||||
|
|
||||||
// Players list
|
|
||||||
var playersHeader = CreateHorizontalGroup(lobbyContainer.transform, "Players_Header", 10, TextAnchor.MiddleLeft, new RectOffset(0,0,0,0));
|
|
||||||
CreateText(playersHeader.transform, "Text_PlayersTitle", "PLAYERS", 20, TextAnchor.MiddleLeft, Color.white, FontStyles.Bold);
|
|
||||||
CreateText(playersHeader.transform, "Text_PlayerCount", "0/4", 18, TextAnchor.MiddleRight, new Color(0.7f,1f,0.7f), FontStyles.Bold);
|
|
||||||
|
|
||||||
var scroll = CreateScrollList(lobbyContainer.transform, out var content, "Scroll_Players", "Viewport", "Content_PlayersList");
|
|
||||||
var empty = CreateText(lobbyContainer.transform, "Empty_Players", "Waiting for players...", 16, TextAnchor.MiddleCenter, new Color(0.8f,0.8f,0.8f), FontStyles.Italic);
|
|
||||||
|
|
||||||
// Template for player entry
|
|
||||||
var template = new GameObject("PlayerItemTemplate", typeof(RectTransform), typeof(HorizontalLayoutGroup));
|
|
||||||
template.transform.SetParent(content, false);
|
|
||||||
var hlg = template.GetComponent<HorizontalLayoutGroup>();
|
|
||||||
hlg.childAlignment = TextAnchor.MiddleLeft; hlg.spacing = 12; hlg.childControlWidth = false; hlg.childForceExpandWidth = true;
|
|
||||||
var avatar = CreateImage(template.transform, "Image_Avatar", new Color(0.3f,0.6f,0.3f));
|
|
||||||
var name = CreateText(template.transform, "Text_PlayerName", "Player", 18, TextAnchor.MiddleLeft, Color.white, FontStyles.Bold);
|
|
||||||
var status = CreateText(template.transform, "Text_PlayerStatus", "NOT READY", 14, TextAnchor.MiddleRight, new Color(0.8f,0.8f,0.8f), FontStyles.Bold);
|
|
||||||
((RectTransform)avatar.transform).sizeDelta = new Vector2(40,40);
|
|
||||||
template.SetActive(false);
|
|
||||||
|
|
||||||
// Host controls
|
|
||||||
var hostControls = CreateHorizontalGroup(lobbyContainer.transform, "Host_Controls", 10, TextAnchor.MiddleCenter, new RectOffset(0,0,0,0));
|
|
||||||
CreateMenuButton(hostControls.transform, "Button_InviteFriends", "INVITE FRIENDS");
|
|
||||||
CreateMenuButton(hostControls.transform, "Button_KickSelected", "KICK SELECTED");
|
|
||||||
|
|
||||||
// Friends picker will be a modal overlay under Panel_Lobby (so it doesn't stretch main layout)
|
|
||||||
var friendsOverlay = new GameObject("Panel_Friends", typeof(RectTransform), typeof(Image));
|
|
||||||
friendsOverlay.transform.SetParent(panelLobby.transform, false);
|
|
||||||
var ovRT = (RectTransform)friendsOverlay.transform; ovRT.anchorMin = new Vector2(0,0); ovRT.anchorMax = new Vector2(1,1); ovRT.offsetMin = Vector2.zero; ovRT.offsetMax = Vector2.zero;
|
|
||||||
var ovImg = friendsOverlay.GetComponent<Image>(); ovImg.color = new Color(0,0,0,0.55f);
|
|
||||||
friendsOverlay.SetActive(false);
|
|
||||||
|
|
||||||
// Transparent background button to close on backdrop click
|
|
||||||
var closeBg = new GameObject("Button_CloseFriendsOverlay", typeof(RectTransform), typeof(Image), typeof(Button));
|
|
||||||
closeBg.transform.SetParent(friendsOverlay.transform, false);
|
|
||||||
var closeBgRT = (RectTransform)closeBg.transform; closeBgRT.anchorMin = new Vector2(0,0); closeBgRT.anchorMax = new Vector2(1,1); closeBgRT.offsetMin = Vector2.zero; closeBgRT.offsetMax = Vector2.zero;
|
|
||||||
var closeBgImg = closeBg.GetComponent<Image>(); closeBgImg.color = new Color(0,0,0,0);
|
|
||||||
|
|
||||||
// Center modal window
|
|
||||||
var friendsWindow = CreatePanel(friendsOverlay.transform, "Friends_Window", new Vector2(900, 420));
|
|
||||||
var friendsV = CreateVerticalGroup(friendsWindow.transform, "Friends_VLayout", 8, TextAnchor.UpperCenter, new RectOffset(16,16,16,16));
|
|
||||||
CreateText(friendsV.transform, "Text_FriendsTitle", "INVITE FRIENDS", 24, TextAnchor.MiddleCenter, Color.white, FontStyles.Bold);
|
|
||||||
CreateText(friendsV.transform, "Text_FriendsHint", "Select a friend to send a Steam invite.", 12, TextAnchor.MiddleCenter, new Color(0.8f,0.8f,0.8f), FontStyles.Normal);
|
|
||||||
var friendsScroll = CreateScrollList(friendsV.transform, out var friendsContent, "Scroll_Friends", "Viewport", "Content_FriendsList");
|
|
||||||
// Make friends content a compact grid of icons
|
|
||||||
var vlgFriends = friendsContent.GetComponent<VerticalLayoutGroup>();
|
|
||||||
if (vlgFriends) Object.DestroyImmediate(vlgFriends);
|
|
||||||
var gridFriends = friendsContent.gameObject.AddComponent<GridLayoutGroup>();
|
|
||||||
gridFriends.cellSize = new Vector2(72, 72);
|
|
||||||
gridFriends.spacing = new Vector2(10, 10);
|
|
||||||
gridFriends.startAxis = GridLayoutGroup.Axis.Horizontal;
|
|
||||||
var csfFriends = friendsContent.GetComponent<ContentSizeFitter>();
|
|
||||||
if (csfFriends == null) csfFriends = friendsContent.gameObject.AddComponent<ContentSizeFitter>();
|
|
||||||
csfFriends.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
|
||||||
CreateText(friendsV.transform, "Empty_Friends", "No friends found.", 14, TextAnchor.MiddleCenter, new Color(0.8f,0.8f,0.8f), FontStyles.Italic);
|
|
||||||
var friendsFooter = CreateHorizontalGroup(friendsV.transform, "Friends_Footer", 8, TextAnchor.MiddleCenter, new RectOffset(0,0,0,0));
|
|
||||||
CreateMenuButton(friendsFooter.transform, "Button_BackFromFriends", "BACK");
|
|
||||||
|
|
||||||
// Ready
|
|
||||||
CreateMenuButton(lobbyContainer.transform, "Button_ToggleReady", "TOGGLE READY");
|
|
||||||
|
|
||||||
// Footer
|
|
||||||
var footer = CreateHorizontalGroup(lobbyContainer.transform, "Lobby_Footer", 10, TextAnchor.MiddleCenter, new RectOffset(0,0,0,0));
|
|
||||||
CreateMenuButton(footer.transform, "Button_StartGame", "START GAME");
|
|
||||||
CreateMenuButton(footer.transform, "Button_LeaveLobby", "LEAVE LOBBY");
|
|
||||||
CreateMenuButton(footer.transform, "Button_BackFromLobby", "BACK TO MENU");
|
|
||||||
|
|
||||||
// Controllers
|
// Controllers
|
||||||
var mainCtrl = canvas.gameObject.GetComponent<MegaKoop.UI.UGUIMainMenuController>();
|
var mainCtrl = canvas.gameObject.GetComponent<MegaKoop.UI.UGUIMainMenuController>();
|
||||||
@@ -266,308 +133,13 @@ namespace MegaKoop.EditorTools
|
|||||||
if (lobbyCtrl == null) lobbyCtrl = canvas.gameObject.AddComponent<MegaKoop.UI.UGUIMultiplayerLobbyController>();
|
if (lobbyCtrl == null) lobbyCtrl = canvas.gameObject.AddComponent<MegaKoop.UI.UGUIMultiplayerLobbyController>();
|
||||||
|
|
||||||
// Inject panel references for reliability
|
// Inject panel references for reliability
|
||||||
mainCtrl.SetPanels(panelMain, panelSettings, panelLobby);
|
mainCtrl.SetPanels(mainPanel, settingsPanel, lobbyPanel);
|
||||||
lobbyCtrl.SetLobbyRoot(panelLobby);
|
lobbyCtrl.SetLobbyRoot(lobbyPanel);
|
||||||
|
|
||||||
Selection.activeGameObject = canvas.gameObject;
|
Selection.activeGameObject = canvas.gameObject;
|
||||||
|
|
||||||
Debug.Log("[UGUIMenuBuilder] UGUI Main Menu generated successfully. You can press Play and test.");
|
Debug.Log("[UGUIMenuBuilder] UGUI Main Menu generated successfully. You can press Play and test.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static GameObject CreatePanel(Transform parent, string name, Vector2 size)
|
|
||||||
{
|
|
||||||
var go = new GameObject(name, typeof(RectTransform), typeof(Image));
|
|
||||||
go.transform.SetParent(parent, false);
|
|
||||||
var rt = (RectTransform)go.transform;
|
|
||||||
rt.anchorMin = rt.anchorMax = new Vector2(0.5f, 0.5f);
|
|
||||||
rt.pivot = new Vector2(0.5f, 0.5f);
|
|
||||||
rt.sizeDelta = size;
|
|
||||||
var img = go.GetComponent<Image>();
|
|
||||||
img.color = new Color(0.13f, 0.13f, 0.13f, 0.95f);
|
|
||||||
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<Font>("LegacyRuntime.ttf");
|
|
||||||
foreach (var t in go.GetComponentsInChildren<Text>(true)) t.font = font;
|
|
||||||
var dd = go.GetComponent<Dropdown>();
|
|
||||||
dd.options = (options != null ? options.Select(o => new Dropdown.OptionData(o)).ToList() : new System.Collections.Generic.List<Dropdown.OptionData>());
|
|
||||||
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));
|
|
||||||
go.transform.SetParent(parent, false);
|
|
||||||
var rt = (RectTransform)go.transform;
|
|
||||||
rt.anchorMin = new Vector2(0, 0); rt.anchorMax = new Vector2(1, 1); rt.offsetMin = new Vector2(0,0); rt.offsetMax = new Vector2(0,0);
|
|
||||||
var vlg = go.GetComponent<VerticalLayoutGroup>();
|
|
||||||
vlg.spacing = spacing; vlg.childAlignment = align; vlg.padding = padding; vlg.childForceExpandWidth = true; vlg.childControlWidth = true; vlg.childControlHeight = false;
|
|
||||||
var fitter = go.GetComponent<ContentSizeFitter>();
|
|
||||||
fitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize; fitter.horizontalFit = ContentSizeFitter.FitMode.Unconstrained;
|
|
||||||
return go;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static GameObject CreateHorizontalGroup(Transform parent, string name, float spacing, TextAnchor align, RectOffset padding)
|
|
||||||
{
|
|
||||||
var go = new GameObject(name, typeof(RectTransform), typeof(HorizontalLayoutGroup));
|
|
||||||
go.transform.SetParent(parent, false);
|
|
||||||
var rt = (RectTransform)go.transform;
|
|
||||||
rt.anchorMin = new Vector2(0, 0); rt.anchorMax = new Vector2(1, 0); rt.pivot = new Vector2(0.5f, 0.5f);
|
|
||||||
rt.sizeDelta = new Vector2(0, 60);
|
|
||||||
var hlg = go.GetComponent<HorizontalLayoutGroup>();
|
|
||||||
hlg.spacing = spacing; hlg.childAlignment = align; hlg.padding = padding; hlg.childControlWidth = true; hlg.childForceExpandWidth = true;
|
|
||||||
return go;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static GameObject CreateText(Transform parent, string name, string text, int fontSize, TextAnchor anchor, Color color, FontStyles fontStyle)
|
|
||||||
{
|
|
||||||
var go = new GameObject(name, typeof(RectTransform), typeof(TextMeshProUGUI), typeof(LayoutElement));
|
|
||||||
go.transform.SetParent(parent, false);
|
|
||||||
var t = go.GetComponent<TextMeshProUGUI>();
|
|
||||||
t.text = text; t.fontSize = fontSize; t.color = color; t.alignment = MapAlignment(anchor); t.fontStyle = fontStyle;
|
|
||||||
t.enableWordWrapping = false; // avoid vertical letters
|
|
||||||
t.raycastTarget = false; // don't block parent UI clicks
|
|
||||||
if (TMP_Settings.defaultFontAsset != null) t.font = TMP_Settings.defaultFontAsset;
|
|
||||||
var le = go.GetComponent<LayoutElement>();
|
|
||||||
le.minHeight = Mathf.Max(24, fontSize + 12);
|
|
||||||
var rt = (RectTransform)go.transform; rt.sizeDelta = new Vector2(0, fontSize + 20);
|
|
||||||
return go;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static TextAlignmentOptions MapAlignment(TextAnchor anchor)
|
|
||||||
{
|
|
||||||
switch (anchor)
|
|
||||||
{
|
|
||||||
case TextAnchor.UpperLeft: return TextAlignmentOptions.TopLeft;
|
|
||||||
case TextAnchor.UpperCenter: return TextAlignmentOptions.Top;
|
|
||||||
case TextAnchor.UpperRight: return TextAlignmentOptions.TopRight;
|
|
||||||
case TextAnchor.MiddleLeft: return TextAlignmentOptions.MidlineLeft;
|
|
||||||
case TextAnchor.MiddleCenter: return TextAlignmentOptions.Midline;
|
|
||||||
case TextAnchor.MiddleRight: return TextAlignmentOptions.MidlineRight;
|
|
||||||
case TextAnchor.LowerLeft: return TextAlignmentOptions.BottomLeft;
|
|
||||||
case TextAnchor.LowerCenter: return TextAlignmentOptions.Bottom;
|
|
||||||
case TextAnchor.LowerRight: return TextAlignmentOptions.BottomRight;
|
|
||||||
default: return TextAlignmentOptions.Center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static GameObject CreateMenuButton(Transform parent, string name, string label, bool isDanger = false)
|
|
||||||
{
|
|
||||||
var go = new GameObject(name, typeof(RectTransform), typeof(Image), typeof(Button));
|
|
||||||
go.transform.SetParent(parent, false);
|
|
||||||
var img = go.GetComponent<Image>();
|
|
||||||
img.color = isDanger ? new Color(0.5f, 0.15f, 0.15f, 0.9f) : new Color(0.25f, 0.5f, 0.25f, 0.9f);
|
|
||||||
var rt = (RectTransform)go.transform; rt.sizeDelta = new Vector2(0, 48);
|
|
||||||
var leBtn = go.AddComponent<LayoutElement>();
|
|
||||||
leBtn.flexibleWidth = 1; leBtn.minHeight = 48;
|
|
||||||
var text = CreateText(go.transform, "Text", label, 20, TextAnchor.MiddleCenter, Color.white, FontStyles.Bold);
|
|
||||||
var textRT = (RectTransform)text.transform; textRT.anchorMin = new Vector2(0,0); textRT.anchorMax = new Vector2(1,1); textRT.offsetMin = Vector2.zero; textRT.offsetMax = Vector2.zero;
|
|
||||||
return go;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static GameObject CreateInputField(Transform parent, string name, string placeholder)
|
|
||||||
{
|
|
||||||
var go = new GameObject(name, typeof(RectTransform), typeof(Image), typeof(TMP_InputField));
|
|
||||||
go.transform.SetParent(parent, false);
|
|
||||||
var img = go.GetComponent<Image>(); img.color = new Color(0.1f,0.1f,0.1f,0.9f);
|
|
||||||
var rt = (RectTransform)go.transform; rt.sizeDelta = new Vector2(600, 50);
|
|
||||||
var viewport = new GameObject("TextViewport", typeof(RectTransform)); viewport.transform.SetParent(go.transform, false);
|
|
||||||
var viewportRT = (RectTransform)viewport.transform; viewportRT.anchorMin = new Vector2(0,0); viewportRT.anchorMax = new Vector2(1,1); viewportRT.offsetMin = new Vector2(10,6); viewportRT.offsetMax = new Vector2(-10,-6);
|
|
||||||
var text = CreateText(viewport.transform, "Text", string.Empty, 20, TextAnchor.MiddleLeft, Color.white, FontStyles.Normal);
|
|
||||||
var placeholderGO = CreateText(viewport.transform, "Placeholder", placeholder, 18, TextAnchor.MiddleLeft, new Color(0.7f,0.7f,0.7f), FontStyles.Italic);
|
|
||||||
var input = go.GetComponent<TMP_InputField>();
|
|
||||||
input.textViewport = viewportRT;
|
|
||||||
input.textComponent = text.GetComponent<TextMeshProUGUI>();
|
|
||||||
input.placeholder = placeholderGO.GetComponent<TextMeshProUGUI>();
|
|
||||||
var tRT = (RectTransform)text.transform; tRT.anchorMin = new Vector2(0,0); tRT.anchorMax = new Vector2(1,1); tRT.offsetMin = new Vector2(10,0); tRT.offsetMax = new Vector2(-10,0);
|
|
||||||
var pRT = (RectTransform)placeholderGO.transform; pRT.anchorMin = new Vector2(0,0); pRT.anchorMax = new Vector2(1,1); pRT.offsetMin = new Vector2(10,0); pRT.offsetMax = new Vector2(-10,0);
|
|
||||||
return go;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static GameObject CreateDropdown(Transform parent, string name, string[] options)
|
|
||||||
{
|
|
||||||
var go = new GameObject(name, typeof(RectTransform), typeof(Image), typeof(TMP_Dropdown));
|
|
||||||
go.transform.SetParent(parent, false);
|
|
||||||
var img = go.GetComponent<Image>(); img.color = new Color(0.2f,0.2f,0.2f,0.9f);
|
|
||||||
var rt = (RectTransform)go.transform; rt.sizeDelta = new Vector2(600, 50);
|
|
||||||
|
|
||||||
// Caption label
|
|
||||||
var caption = CreateText(go.transform, "Label", options.FirstOrDefault() ?? "Option", 18, TextAnchor.MiddleLeft, Color.white, FontStyles.Normal);
|
|
||||||
var arrow = CreateText(go.transform, "Arrow", "▼", 18, TextAnchor.MiddleRight, Color.white, FontStyles.Bold);
|
|
||||||
|
|
||||||
// Template (disabled by default)
|
|
||||||
var template = new GameObject("Template", typeof(RectTransform), typeof(Image), typeof(ScrollRect));
|
|
||||||
template.transform.SetParent(go.transform, false);
|
|
||||||
var templateRT = (RectTransform)template.transform;
|
|
||||||
templateRT.anchorMin = new Vector2(0, 0); templateRT.anchorMax = new Vector2(1, 0); templateRT.pivot = new Vector2(0.5f, 1);
|
|
||||||
templateRT.sizeDelta = new Vector2(0, 220); // visible dropdown height
|
|
||||||
template.SetActive(false);
|
|
||||||
var templateImg = template.GetComponent<Image>(); templateImg.color = new Color(0.1f,0.1f,0.1f,0.95f);
|
|
||||||
|
|
||||||
var tplCanvas = template.GetComponent<Canvas>();
|
|
||||||
if (tplCanvas == null) tplCanvas = template.AddComponent<Canvas>();
|
|
||||||
tplCanvas.overrideSorting = true;
|
|
||||||
tplCanvas.sortingOrder = 5000;
|
|
||||||
if (!template.GetComponent<GraphicRaycaster>()) template.AddComponent<GraphicRaycaster>();
|
|
||||||
|
|
||||||
// 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<Image>(); vImg.color = new Color(0,0,0,0.2f); vImg.raycastTarget = false;
|
|
||||||
var mask = viewport.GetComponent<Mask>(); mask.showMaskGraphic = false;
|
|
||||||
|
|
||||||
// Scroll content
|
|
||||||
var content = new GameObject("Content", typeof(RectTransform), typeof(VerticalLayoutGroup));
|
|
||||||
content.transform.SetParent(viewport.transform, false);
|
|
||||||
var contentRT = (RectTransform)content.transform; contentRT.anchorMin = new Vector2(0,1); contentRT.anchorMax = new Vector2(1,1); contentRT.pivot = new Vector2(0.5f,1);
|
|
||||||
var vlg = content.GetComponent<VerticalLayoutGroup>(); vlg.spacing = 4; vlg.childForceExpandWidth = true; vlg.childControlHeight = true;
|
|
||||||
|
|
||||||
// Item (Toggle)
|
|
||||||
var item = new GameObject("Item", typeof(RectTransform), typeof(Toggle));
|
|
||||||
item.transform.SetParent(content.transform, false);
|
|
||||||
var itemRT = (RectTransform)item.transform; itemRT.sizeDelta = new Vector2(0, 30);
|
|
||||||
var itemBG = new GameObject("Item Background", typeof(RectTransform), typeof(Image));
|
|
||||||
itemBG.transform.SetParent(item.transform, false);
|
|
||||||
var itemBGImg = itemBG.GetComponent<Image>(); itemBGImg.color = new Color(0.2f,0.2f,0.2f,0.9f);
|
|
||||||
var itemCheck = new GameObject("Item Checkmark", typeof(RectTransform), typeof(Image));
|
|
||||||
itemCheck.transform.SetParent(itemBG.transform, false);
|
|
||||||
var itemCheckImg = itemCheck.GetComponent<Image>(); itemCheckImg.color = new Color(0.7f,1f,0.7f,1f);
|
|
||||||
var itemLabelGO = CreateText(item.transform, "Item Label", "Option", 18, TextAnchor.MiddleLeft, Color.white, FontStyles.Normal);
|
|
||||||
|
|
||||||
// Position sub-elements
|
|
||||||
var bgRT = (RectTransform)itemBG.transform; bgRT.anchorMin = new Vector2(0,0); bgRT.anchorMax = new Vector2(1,1); bgRT.offsetMin = Vector2.zero; bgRT.offsetMax = Vector2.zero;
|
|
||||||
var ckRT = (RectTransform)itemCheck.transform; ckRT.anchorMin = new Vector2(0,0.5f); ckRT.anchorMax = new Vector2(0,0.5f); ckRT.pivot = new Vector2(0,0.5f); ckRT.sizeDelta = new Vector2(18,18); ckRT.anchoredPosition = new Vector2(6,0);
|
|
||||||
var itemLabelRT = (RectTransform)itemLabelGO.transform; itemLabelRT.anchorMin = new Vector2(0,0); itemLabelRT.anchorMax = new Vector2(1,1); itemLabelRT.offsetMin = new Vector2(28,0); itemLabelRT.offsetMax = new Vector2(-6,0);
|
|
||||||
|
|
||||||
// Toggle wiring
|
|
||||||
var tgl = item.GetComponent<Toggle>();
|
|
||||||
tgl.targetGraphic = itemBGImg; tgl.graphic = itemCheckImg;
|
|
||||||
|
|
||||||
// Dropdown wiring
|
|
||||||
var dd = go.GetComponent<TMP_Dropdown>();
|
|
||||||
dd.template = template.GetComponent<RectTransform>();
|
|
||||||
dd.captionText = caption.GetComponent<TextMeshProUGUI>();
|
|
||||||
dd.itemText = itemLabelGO.GetComponent<TextMeshProUGUI>();
|
|
||||||
dd.options = options.Select(o => new TMP_Dropdown.OptionData(o)).ToList();
|
|
||||||
dd.alphaFadeSpeed = 0.15f;
|
|
||||||
dd.RefreshShownValue();
|
|
||||||
|
|
||||||
// ScrollRect wiring
|
|
||||||
var scr = template.GetComponent<ScrollRect>();
|
|
||||||
scr.viewport = viewport.GetComponent<RectTransform>();
|
|
||||||
scr.content = content.GetComponent<RectTransform>();
|
|
||||||
scr.horizontal = false; scr.vertical = true;
|
|
||||||
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>();
|
|
||||||
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<Image>(); 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<Image>(); 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<Image>(); 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<RectTransform>();
|
|
||||||
slider.handleRect = handle.GetComponent<RectTransform>();
|
|
||||||
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));
|
|
||||||
go.transform.SetParent(parent, false);
|
|
||||||
var bg = CreateImage(go.transform, "Background", new Color(0.2f,0.2f,0.2f));
|
|
||||||
var check = CreateImage(bg.transform, "Checkmark", new Color(0.7f,1f,0.7f));
|
|
||||||
var label = CreateText(go.transform, "Label", labelText, 18, TextAnchor.MiddleLeft, Color.white, FontStyles.Normal);
|
|
||||||
var t = go.GetComponent<Toggle>();
|
|
||||||
t.isOn = initial; t.graphic = check.GetComponent<Image>(); t.targetGraphic = bg.GetComponent<Image>();
|
|
||||||
var rt = (RectTransform)go.transform; rt.sizeDelta = new Vector2(600, 40);
|
|
||||||
var bgRT = (RectTransform)bg.transform; bgRT.anchorMin = new Vector2(0,0.5f); bgRT.anchorMax = new Vector2(0,0.5f); bgRT.pivot = new Vector2(0,0.5f); bgRT.sizeDelta = new Vector2(24,24);
|
|
||||||
var checkRT = (RectTransform)check.transform; checkRT.anchorMin = checkRT.anchorMax = new Vector2(0.5f,0.5f); checkRT.sizeDelta = new Vector2(16,16);
|
|
||||||
var labelRT = (RectTransform)label.transform; labelRT.anchorMin = new Vector2(0,0); labelRT.anchorMax = new Vector2(1,1); labelRT.offsetMin = new Vector2(34,0); labelRT.offsetMax = new Vector2(0,0);
|
|
||||||
return go;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static GameObject CreateImage(Transform parent, string name, Color color)
|
|
||||||
{
|
|
||||||
var go = new GameObject(name, typeof(RectTransform), typeof(Image));
|
|
||||||
go.transform.SetParent(parent, false);
|
|
||||||
var img = go.GetComponent<Image>(); img.color = color;
|
|
||||||
return go;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CreateSpacer(Transform parent, float height)
|
|
||||||
{
|
|
||||||
var sp = new GameObject("Spacer", typeof(RectTransform));
|
|
||||||
sp.transform.SetParent(parent, false);
|
|
||||||
var rt = (RectTransform)sp.transform; rt.sizeDelta = new Vector2(0, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static ScrollRect CreateScrollList(Transform parent, out Transform content, string scrollName, string viewportName, string contentName)
|
|
||||||
{
|
|
||||||
var scrollGO = new GameObject(scrollName, typeof(RectTransform), typeof(Image), typeof(ScrollRect));
|
|
||||||
scrollGO.transform.SetParent(parent, false);
|
|
||||||
var srt = (RectTransform)scrollGO.transform; srt.sizeDelta = new Vector2(0, 240);
|
|
||||||
var img = scrollGO.GetComponent<Image>(); img.color = new Color(0,0,0,0.3f);
|
|
||||||
var viewport = new GameObject(viewportName, typeof(RectTransform), typeof(Mask), typeof(Image));
|
|
||||||
viewport.transform.SetParent(scrollGO.transform, false);
|
|
||||||
var vImg = viewport.GetComponent<Image>(); vImg.color = new Color(0,0,0,0.1f);
|
|
||||||
viewport.GetComponent<Mask>().showMaskGraphic = false;
|
|
||||||
var vprt = (RectTransform)viewport.transform; vprt.anchorMin = new Vector2(0,0); vprt.anchorMax = new Vector2(1,1); vprt.offsetMin = Vector2.zero; vprt.offsetMax = Vector2.zero;
|
|
||||||
var contentGO = new GameObject(contentName, typeof(RectTransform), typeof(VerticalLayoutGroup));
|
|
||||||
contentGO.transform.SetParent(viewport.transform, false);
|
|
||||||
var vlg = contentGO.GetComponent<VerticalLayoutGroup>(); vlg.spacing = 8; vlg.childAlignment = TextAnchor.UpperLeft; vlg.childForceExpandWidth = true;
|
|
||||||
var crt = (RectTransform)contentGO.transform; crt.anchorMin = new Vector2(0,1); crt.anchorMax = new Vector2(1,1); crt.pivot = new Vector2(0.5f,1); crt.offsetMin = new Vector2(0,0); crt.offsetMax = new Vector2(0,0);
|
|
||||||
var csf = contentGO.AddComponent<ContentSizeFitter>(); csf.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
|
|
||||||
content = contentGO.transform;
|
|
||||||
var scroll = scrollGO.GetComponent<ScrollRect>(); scroll.viewport = (RectTransform)viewport.transform; scroll.content = (RectTransform)content; scroll.horizontal = false; scroll.vertical = true;
|
|
||||||
return scroll;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
17528
Scenes/MainMenu.unity
17528
Scenes/MainMenu.unity
File diff suppressed because it is too large
Load Diff
@@ -2,20 +2,28 @@
|
|||||||
%TAG !u! tag:unity3d.com,2011:
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
--- !u!21 &2100000
|
--- !u!21 &2100000
|
||||||
Material:
|
Material:
|
||||||
serializedVersion: 6
|
serializedVersion: 8
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_Name: LiberationSans SDF - Metalic Green
|
m_Name: LiberationSans SDF - Metalic Green
|
||||||
m_Shader: {fileID: 4800000, guid: 68e6db2ebdc24f95958faec2be5558d6, type: 3}
|
m_Shader: {fileID: 4800000, guid: 68e6db2ebdc24f95958faec2be5558d6, type: 3}
|
||||||
m_ShaderKeywords: BEVEL_ON GLOW_ON OUTLINE_ON UNDERLAY_ON
|
m_Parent: {fileID: 0}
|
||||||
|
m_ModifiedSerializedProperties: 0
|
||||||
|
m_ValidKeywords:
|
||||||
|
- BEVEL_ON
|
||||||
|
- GLOW_ON
|
||||||
|
- OUTLINE_ON
|
||||||
|
- UNDERLAY_ON
|
||||||
|
m_InvalidKeywords: []
|
||||||
m_LightmapFlags: 5
|
m_LightmapFlags: 5
|
||||||
m_EnableInstancingVariants: 0
|
m_EnableInstancingVariants: 0
|
||||||
m_DoubleSidedGI: 0
|
m_DoubleSidedGI: 0
|
||||||
m_CustomRenderQueue: -1
|
m_CustomRenderQueue: -1
|
||||||
stringTagMap: {}
|
stringTagMap: {}
|
||||||
disabledShaderPasses: []
|
disabledShaderPasses: []
|
||||||
|
m_LockedProperties:
|
||||||
m_SavedProperties:
|
m_SavedProperties:
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_TexEnvs:
|
m_TexEnvs:
|
||||||
@@ -32,14 +40,14 @@ Material:
|
|||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
- _MainTex:
|
- _MainTex:
|
||||||
m_Texture: {fileID: 28684132378477856, guid: 8f586378b4e144a9851e7b34d9b748ee,
|
m_Texture: {fileID: 28684132378477856, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
|
||||||
type: 2}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
- _OutlineTex:
|
- _OutlineTex:
|
||||||
m_Texture: {fileID: 2800000, guid: f88677df267a41d6be1e7a6133e7d227, type: 3}
|
m_Texture: {fileID: 2800000, guid: f88677df267a41d6be1e7a6133e7d227, type: 3}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 1, y: 1}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
|
m_Ints: []
|
||||||
m_Floats:
|
m_Floats:
|
||||||
- _Ambient: 0
|
- _Ambient: 0
|
||||||
- _Bevel: 1
|
- _Bevel: 1
|
||||||
@@ -50,6 +58,7 @@ Material:
|
|||||||
- _BumpFace: 0
|
- _BumpFace: 0
|
||||||
- _BumpOutline: 0
|
- _BumpOutline: 0
|
||||||
- _ColorMask: 15
|
- _ColorMask: 15
|
||||||
|
- _CullMode: 0
|
||||||
- _Diffuse: 0
|
- _Diffuse: 0
|
||||||
- _FaceDilate: 0.15
|
- _FaceDilate: 0.15
|
||||||
- _FaceUVSpeedX: 0
|
- _FaceUVSpeedX: 0
|
||||||
@@ -69,8 +78,8 @@ Material:
|
|||||||
- _PerspectiveFilter: 0
|
- _PerspectiveFilter: 0
|
||||||
- _Reflectivity: 12.76
|
- _Reflectivity: 12.76
|
||||||
- _ScaleRatioA: 0.9
|
- _ScaleRatioA: 0.9
|
||||||
- _ScaleRatioB: 0.6525
|
- _ScaleRatioB: 0.59624994
|
||||||
- _ScaleRatioC: 0.6525
|
- _ScaleRatioC: 0.59624994
|
||||||
- _ScaleX: 1
|
- _ScaleX: 1
|
||||||
- _ScaleY: 1
|
- _ScaleY: 1
|
||||||
- _ShaderFlags: 0
|
- _ShaderFlags: 0
|
||||||
@@ -102,3 +111,5 @@ Material:
|
|||||||
- _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1}
|
- _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
- _SpecularColor: {r: 0.7689687, g: 1, b: 0.75000346, a: 1}
|
- _SpecularColor: {r: 0.7689687, g: 1, b: 0.75000346, a: 1}
|
||||||
- _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
|
- _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
|
||||||
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -26,8 +26,6 @@ namespace MegaKoop.UI
|
|||||||
private GameObject panelLobby;
|
private GameObject panelLobby;
|
||||||
|
|
||||||
[Header("Manual Wiring - Main Menu Buttons")]
|
[Header("Manual Wiring - Main Menu Buttons")]
|
||||||
[SerializeField] private Button btnNewGame;
|
|
||||||
[SerializeField] private Button btnContinue;
|
|
||||||
[SerializeField] private Button btnMultiplayer;
|
[SerializeField] private Button btnMultiplayer;
|
||||||
[SerializeField] private Button btnSettings;
|
[SerializeField] private Button btnSettings;
|
||||||
[SerializeField] private Button btnQuit;
|
[SerializeField] private Button btnQuit;
|
||||||
@@ -41,8 +39,6 @@ namespace MegaKoop.UI
|
|||||||
[SerializeField] private Slider slMaster;
|
[SerializeField] private Slider slMaster;
|
||||||
[SerializeField] private Slider slMusic;
|
[SerializeField] private Slider slMusic;
|
||||||
[SerializeField] private Slider slSFX;
|
[SerializeField] private Slider slSFX;
|
||||||
[SerializeField] private Dropdown ddQualityUI;
|
|
||||||
[SerializeField] private Dropdown ddResolutionUI;
|
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
@@ -50,18 +46,14 @@ namespace MegaKoop.UI
|
|||||||
RefreshPanelReferences();
|
RefreshPanelReferences();
|
||||||
|
|
||||||
// Buttons
|
// Buttons
|
||||||
btnNewGame = EnsureButton(btnNewGame, "Button_NewGame", panelMain ? panelMain.transform : this.transform);
|
|
||||||
btnContinue = EnsureButton(btnContinue, "Button_Continue", panelMain ? panelMain.transform : this.transform);
|
|
||||||
btnMultiplayer = EnsureButton(btnMultiplayer, "Button_Multiplayer", panelMain ? panelMain.transform : this.transform);
|
btnMultiplayer = EnsureButton(btnMultiplayer, "Button_Multiplayer", panelMain ? panelMain.transform : this.transform);
|
||||||
btnSettings = EnsureButton(btnSettings, "Button_Settings", 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);
|
btnQuit = EnsureButton(btnQuit, "Button_Quit", panelMain ? panelMain.transform : this.transform);
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
ddQuality = EnsureDropdown(ddQuality, "Dropdown_Quality", panelSettings ? panelSettings.transform : this.transform);
|
ddQuality = EnsureDropdown(ddQuality, "Dropdown_Quality", panelSettings ? panelSettings.transform : this.transform);
|
||||||
ddQualityUI = EnsureUIDropdown(ddQualityUI, "Dropdown_Quality", panelSettings ? panelSettings.transform : this.transform);
|
|
||||||
tgFullscreen = EnsureToggle(tgFullscreen, "Toggle_Fullscreen", 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);
|
ddResolution = EnsureDropdown(ddResolution, "Dropdown_Resolution", panelSettings ? panelSettings.transform : this.transform);
|
||||||
ddResolutionUI = EnsureUIDropdown(ddResolutionUI, "Dropdown_Resolution", panelSettings ? panelSettings.transform : this.transform);
|
|
||||||
btnApplySettings = EnsureButton(btnApplySettings, "Button_ApplySettings", 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);
|
btnBackFromSettings = EnsureButton(btnBackFromSettings, "Button_BackFromSettings", panelSettings ? panelSettings.transform : this.transform);
|
||||||
slMaster = EnsureSlider(slMaster, "Slider_MasterVolume", panelSettings ? panelSettings.transform : this.transform);
|
slMaster = EnsureSlider(slMaster, "Slider_MasterVolume", panelSettings ? panelSettings.transform : this.transform);
|
||||||
@@ -79,31 +71,6 @@ namespace MegaKoop.UI
|
|||||||
ShowMainMenu();
|
ShowMainMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Dropdown EnsureUIDropdown(Dropdown existing, string name, Transform scope)
|
|
||||||
{
|
|
||||||
if (existing) return existing;
|
|
||||||
return FindUIDropdown(name, scope);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Dropdown FindUIDropdown(string name, Transform scope = null)
|
|
||||||
{
|
|
||||||
if (scope != null)
|
|
||||||
{
|
|
||||||
var comps = scope.GetComponentsInChildren<Dropdown>(true);
|
|
||||||
foreach (var c in comps)
|
|
||||||
{
|
|
||||||
if (c && c.name == name) return c;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
var all = Resources.FindObjectsOfTypeAll<Dropdown>();
|
|
||||||
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
|
// Allow UGUIMenuBuilder to inject panel refs directly
|
||||||
public void SetPanels(GameObject main, GameObject settings, GameObject lobby)
|
public void SetPanels(GameObject main, GameObject settings, GameObject lobby)
|
||||||
{
|
{
|
||||||
@@ -113,24 +80,20 @@ namespace MegaKoop.UI
|
|||||||
RefreshPanelReferences();
|
RefreshPanelReferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetMainMenuButtons(Button newGame, Button continueButton, Button multiplayerButton, Button settingsButton, Button quitButton)
|
public void SetMainMenuButtons(Button multiplayerButton, Button settingsButton, Button quitButton)
|
||||||
{
|
{
|
||||||
btnNewGame = newGame;
|
|
||||||
btnContinue = continueButton;
|
|
||||||
btnMultiplayer = multiplayerButton;
|
btnMultiplayer = multiplayerButton;
|
||||||
btnSettings = settingsButton;
|
btnSettings = settingsButton;
|
||||||
btnQuit = quitButton;
|
btnQuit = quitButton;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetSettingsControls(TMP_Dropdown qualityDropdown, Dropdown legacyQualityDropdown, Toggle fullscreenToggle,
|
public void SetSettingsControls(TMP_Dropdown qualityDropdown, Toggle fullscreenToggle,
|
||||||
TMP_Dropdown resolutionDropdown, Dropdown legacyResolutionDropdown, Slider masterVolume, Slider musicVolume, Slider sfxVolume,
|
TMP_Dropdown resolutionDropdown, Slider masterVolume, Slider musicVolume, Slider sfxVolume,
|
||||||
Button applyButton, Button backButton)
|
Button applyButton, Button backButton)
|
||||||
{
|
{
|
||||||
ddQuality = qualityDropdown;
|
ddQuality = qualityDropdown;
|
||||||
ddQualityUI = legacyQualityDropdown;
|
|
||||||
tgFullscreen = fullscreenToggle;
|
tgFullscreen = fullscreenToggle;
|
||||||
ddResolution = resolutionDropdown;
|
ddResolution = resolutionDropdown;
|
||||||
ddResolutionUI = legacyResolutionDropdown;
|
|
||||||
slMaster = masterVolume;
|
slMaster = masterVolume;
|
||||||
slMusic = musicVolume;
|
slMusic = musicVolume;
|
||||||
slSFX = sfxVolume;
|
slSFX = sfxVolume;
|
||||||
@@ -272,8 +235,6 @@ namespace MegaKoop.UI
|
|||||||
|
|
||||||
private void WireEvents()
|
private void WireEvents()
|
||||||
{
|
{
|
||||||
if (btnNewGame) btnNewGame.onClick.AddListener(OnNewGame); else Debug.LogWarning("[UGUIMainMenu] Button_NewGame not found");
|
|
||||||
if (btnContinue) btnContinue.onClick.AddListener(OnContinue); else Debug.LogWarning("[UGUIMainMenu] Button_Continue not found");
|
|
||||||
if (btnMultiplayer) btnMultiplayer.onClick.AddListener(OnOpenMultiplayer); else Debug.LogWarning("[UGUIMainMenu] Button_Multiplayer not found");
|
if (btnMultiplayer) btnMultiplayer.onClick.AddListener(OnOpenMultiplayer); else Debug.LogWarning("[UGUIMainMenu] Button_Multiplayer not found");
|
||||||
if (btnSettings) btnSettings.onClick.AddListener(OnOpenSettings); else Debug.LogWarning("[UGUIMainMenu] Button_Settings not found");
|
if (btnSettings) btnSettings.onClick.AddListener(OnOpenSettings); else Debug.LogWarning("[UGUIMainMenu] Button_Settings not found");
|
||||||
if (btnQuit) btnQuit.onClick.AddListener(OnQuit); else Debug.LogWarning("[UGUIMainMenu] Button_Quit not found");
|
if (btnQuit) btnQuit.onClick.AddListener(OnQuit); else Debug.LogWarning("[UGUIMainMenu] Button_Quit not found");
|
||||||
@@ -283,8 +244,6 @@ namespace MegaKoop.UI
|
|||||||
|
|
||||||
if (ddQuality) ddQuality.onValueChanged.AddListener(i => { Debug.Log("[UGUIMainMenu] Quality changed to index " + i); ddQuality.RefreshShownValue(); });
|
if (ddQuality) ddQuality.onValueChanged.AddListener(i => { Debug.Log("[UGUIMainMenu] Quality changed to index " + i); ddQuality.RefreshShownValue(); });
|
||||||
if (ddResolution) ddResolution.onValueChanged.AddListener(i => { Debug.Log("[UGUIMainMenu] Resolution changed to index " + i); ddResolution.RefreshShownValue(); });
|
if (ddResolution) ddResolution.onValueChanged.AddListener(i => { Debug.Log("[UGUIMainMenu] Resolution changed to index " + i); ddResolution.RefreshShownValue(); });
|
||||||
if (ddQualityUI) ddQualityUI.onValueChanged.AddListener(i => { Debug.Log("[UGUIMainMenu] UI Quality changed to index " + i); ddQualityUI.RefreshShownValue(); });
|
|
||||||
if (ddResolutionUI) ddResolutionUI.onValueChanged.AddListener(i => { Debug.Log("[UGUIMainMenu] UI Resolution changed to index " + i); ddResolutionUI.RefreshShownValue(); });
|
|
||||||
if (tgFullscreen) tgFullscreen.onValueChanged.AddListener(v => { Debug.Log("[UGUIMainMenu] Fullscreen " + v); });
|
if (tgFullscreen) tgFullscreen.onValueChanged.AddListener(v => { Debug.Log("[UGUIMainMenu] Fullscreen " + v); });
|
||||||
if (slMaster) slMaster.onValueChanged.AddListener(v => { AudioListener.volume = v / 100f; });
|
if (slMaster) slMaster.onValueChanged.AddListener(v => { AudioListener.volume = v / 100f; });
|
||||||
}
|
}
|
||||||
@@ -329,42 +288,6 @@ namespace MegaKoop.UI
|
|||||||
Debug.Log("[UGUIMainMenu] Open Settings");
|
Debug.Log("[UGUIMainMenu] Open Settings");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnNewGame()
|
|
||||||
{
|
|
||||||
// Co-op only: quick host path
|
|
||||||
UGUIMultiplayerLobbyController lobby;
|
|
||||||
#if UNITY_2023_1_OR_NEWER
|
|
||||||
lobby = Object.FindFirstObjectByType<UGUIMultiplayerLobbyController>();
|
|
||||||
#else
|
|
||||||
lobby = Object.FindObjectOfType<UGUIMultiplayerLobbyController>();
|
|
||||||
#endif
|
|
||||||
if (lobby)
|
|
||||||
{
|
|
||||||
if (panelMain) panelMain.SetActive(false);
|
|
||||||
if (panelSettings) panelSettings.SetActive(false);
|
|
||||||
if (panelLobby) panelLobby.SetActive(true);
|
|
||||||
lobby.QuickHost(4, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnContinue()
|
|
||||||
{
|
|
||||||
// Co-op only: join path
|
|
||||||
UGUIMultiplayerLobbyController lobby;
|
|
||||||
#if UNITY_2023_1_OR_NEWER
|
|
||||||
lobby = Object.FindFirstObjectByType<UGUIMultiplayerLobbyController>();
|
|
||||||
#else
|
|
||||||
lobby = Object.FindObjectOfType<UGUIMultiplayerLobbyController>();
|
|
||||||
#endif
|
|
||||||
if (lobby)
|
|
||||||
{
|
|
||||||
if (panelMain) panelMain.SetActive(false);
|
|
||||||
if (panelSettings) panelSettings.SetActive(false);
|
|
||||||
if (panelLobby) panelLobby.SetActive(true);
|
|
||||||
lobby.ShowJoinTabPublic();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnQuit()
|
private void OnQuit()
|
||||||
{
|
{
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
@@ -380,10 +303,6 @@ namespace MegaKoop.UI
|
|||||||
{
|
{
|
||||||
QualitySettings.SetQualityLevel(ddQuality.value, true);
|
QualitySettings.SetQualityLevel(ddQuality.value, true);
|
||||||
}
|
}
|
||||||
else if (ddQualityUI)
|
|
||||||
{
|
|
||||||
QualitySettings.SetQualityLevel(ddQualityUI.value, true);
|
|
||||||
}
|
|
||||||
if (tgFullscreen)
|
if (tgFullscreen)
|
||||||
{
|
{
|
||||||
Screen.fullScreen = tgFullscreen.isOn;
|
Screen.fullScreen = tgFullscreen.isOn;
|
||||||
@@ -400,18 +319,6 @@ namespace MegaKoop.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ddResolutionUI)
|
|
||||||
{
|
|
||||||
if (ddResolutionUI.options != null && ddResolutionUI.options.Count > 0 && ddResolutionUI.value >= 0 && ddResolutionUI.value < ddResolutionUI.options.Count)
|
|
||||||
{
|
|
||||||
var opt = ddResolutionUI.options[ddResolutionUI.value].text;
|
|
||||||
var parts = opt.ToLower().Split('x');
|
|
||||||
if (parts.Length == 2 && int.TryParse(parts[0], out int w) && int.TryParse(parts[1], out int h))
|
|
||||||
{
|
|
||||||
Screen.SetResolution(w, h, Screen.fullScreenMode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (slMaster)
|
if (slMaster)
|
||||||
{
|
{
|
||||||
AudioListener.volume = slMaster.value / 100f;
|
AudioListener.volume = slMaster.value / 100f;
|
||||||
@@ -442,35 +349,6 @@ namespace MegaKoop.UI
|
|||||||
FixDropdownRaycasts(ddQuality);
|
FixDropdownRaycasts(ddQuality);
|
||||||
SetupDropdownTemplateCanvas(ddQuality);
|
SetupDropdownTemplateCanvas(ddQuality);
|
||||||
}
|
}
|
||||||
else if (ddQualityUI)
|
|
||||||
{
|
|
||||||
var names = QualitySettings.names;
|
|
||||||
if (names != null && names.Length > 0)
|
|
||||||
{
|
|
||||||
ddQualityUI.ClearOptions();
|
|
||||||
ddQualityUI.AddOptions(new List<Dropdown.OptionData>(System.Array.ConvertAll(names, s => new Dropdown.OptionData(s))));
|
|
||||||
ddQualityUI.value = Mathf.Clamp(QualitySettings.GetQualityLevel(), 0, ddQualityUI.options.Count - 1);
|
|
||||||
ddQualityUI.RefreshShownValue();
|
|
||||||
}
|
|
||||||
if (ddQualityUI.captionText == null)
|
|
||||||
{
|
|
||||||
var cap = ddQualityUI.transform.Find("Label");
|
|
||||||
if (cap) ddQualityUI.captionText = cap.GetComponent<Text>();
|
|
||||||
}
|
|
||||||
if (ddQualityUI.itemText == null && ddQualityUI.template)
|
|
||||||
{
|
|
||||||
var it = ddQualityUI.template.Find("Item");
|
|
||||||
if (it)
|
|
||||||
{
|
|
||||||
var lbl = it.Find("Item Label");
|
|
||||||
if (lbl) ddQualityUI.itemText = lbl.GetComponent<Text>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ddQualityUI.interactable = true;
|
|
||||||
FixDropdownRaycasts(ddQualityUI);
|
|
||||||
SetupDropdownTemplateCanvas(ddQualityUI);
|
|
||||||
Debug.Log("[UGUIMainMenu] UI Quality options=" + (ddQualityUI.options != null ? ddQualityUI.options.Count : 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ddResolution)
|
if (ddResolution)
|
||||||
{
|
{
|
||||||
@@ -500,49 +378,6 @@ namespace MegaKoop.UI
|
|||||||
FixDropdownRaycasts(ddResolution);
|
FixDropdownRaycasts(ddResolution);
|
||||||
SetupDropdownTemplateCanvas(ddResolution);
|
SetupDropdownTemplateCanvas(ddResolution);
|
||||||
}
|
}
|
||||||
else if (ddResolutionUI)
|
|
||||||
{
|
|
||||||
var seen = new HashSet<string>();
|
|
||||||
var opts = new List<string>();
|
|
||||||
string cur = Screen.currentResolution.width + "x" + Screen.currentResolution.height;
|
|
||||||
int curIdx = 0;
|
|
||||||
foreach (var r in Screen.resolutions)
|
|
||||||
{
|
|
||||||
string s = r.width + "x" + r.height;
|
|
||||||
if (seen.Add(s))
|
|
||||||
{
|
|
||||||
if (s == cur) curIdx = opts.Count;
|
|
||||||
opts.Add(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (opts.Count == 0)
|
|
||||||
{
|
|
||||||
opts.Add(cur);
|
|
||||||
curIdx = 0;
|
|
||||||
}
|
|
||||||
ddResolutionUI.ClearOptions();
|
|
||||||
ddResolutionUI.AddOptions(opts.ConvertAll(o => new Dropdown.OptionData(o)));
|
|
||||||
ddResolutionUI.value = Mathf.Clamp(curIdx, 0, ddResolutionUI.options.Count - 1);
|
|
||||||
ddResolutionUI.RefreshShownValue();
|
|
||||||
ddResolutionUI.interactable = true;
|
|
||||||
FixDropdownRaycasts(ddResolutionUI);
|
|
||||||
SetupDropdownTemplateCanvas(ddResolutionUI);
|
|
||||||
if (ddResolutionUI.captionText == null)
|
|
||||||
{
|
|
||||||
var cap = ddResolutionUI.transform.Find("Label");
|
|
||||||
if (cap) ddResolutionUI.captionText = cap.GetComponent<Text>();
|
|
||||||
}
|
|
||||||
if (ddResolutionUI.itemText == null && ddResolutionUI.template)
|
|
||||||
{
|
|
||||||
var it = ddResolutionUI.template.Find("Item");
|
|
||||||
if (it)
|
|
||||||
{
|
|
||||||
var lbl = it.Find("Item Label");
|
|
||||||
if (lbl) ddResolutionUI.itemText = lbl.GetComponent<Text>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Debug.Log("[UGUIMainMenu] UI Resolution options=" + (ddResolutionUI.options != null ? ddResolutionUI.options.Count : 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tgFullscreen)
|
if (tgFullscreen)
|
||||||
{
|
{
|
||||||
@@ -581,12 +416,6 @@ namespace MegaKoop.UI
|
|||||||
ddQuality.value = Mathf.Clamp(q, 0, ddQuality.options.Count - 1);
|
ddQuality.value = Mathf.Clamp(q, 0, ddQuality.options.Count - 1);
|
||||||
ddQuality.RefreshShownValue();
|
ddQuality.RefreshShownValue();
|
||||||
}
|
}
|
||||||
else if (ddQualityUI && ddQualityUI.options.Count > 0)
|
|
||||||
{
|
|
||||||
int q = PlayerPrefs.GetInt("QualityLevel", QualitySettings.GetQualityLevel());
|
|
||||||
ddQualityUI.value = Mathf.Clamp(q, 0, ddQualityUI.options.Count - 1);
|
|
||||||
ddQualityUI.RefreshShownValue();
|
|
||||||
}
|
|
||||||
if (tgFullscreen)
|
if (tgFullscreen)
|
||||||
{
|
{
|
||||||
bool full = PlayerPrefs.GetInt("Fullscreen", Screen.fullScreen ? 1 : 0) == 1;
|
bool full = PlayerPrefs.GetInt("Fullscreen", Screen.fullScreen ? 1 : 0) == 1;
|
||||||
@@ -604,18 +433,6 @@ namespace MegaKoop.UI
|
|||||||
ddResolution.RefreshShownValue();
|
ddResolution.RefreshShownValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ddResolutionUI && ddResolutionUI.options.Count > 0)
|
|
||||||
{
|
|
||||||
int w = PlayerPrefs.GetInt("ResolutionWidth", Screen.currentResolution.width);
|
|
||||||
int h = PlayerPrefs.GetInt("ResolutionHeight", Screen.currentResolution.height);
|
|
||||||
string key = w + "x" + h;
|
|
||||||
int idx = ddResolutionUI.options.FindIndex(o => o.text == key);
|
|
||||||
if (idx >= 0)
|
|
||||||
{
|
|
||||||
ddResolutionUI.value = idx;
|
|
||||||
ddResolutionUI.RefreshShownValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (slMaster)
|
if (slMaster)
|
||||||
{
|
{
|
||||||
var mv = PlayerPrefs.GetFloat("MasterVolume", 100f);
|
var mv = PlayerPrefs.GetFloat("MasterVolume", 100f);
|
||||||
|
|||||||
Reference in New Issue
Block a user