#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(); 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(); 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(); 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(); if (vlgFriends) { Object.DestroyImmediate(vlgFriends); } var gridFriends = friendsContent.gameObject.AddComponent(); gridFriends.cellSize = new Vector2(72, 72); gridFriends.spacing = new Vector2(10, 10); gridFriends.startAxis = GridLayoutGroup.Axis.Horizontal; var csfFriends = friendsContent.GetComponent(); if (csfFriends == null) { csfFriends = friendsContent.gameObject.AddComponent(); } 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