201 lines
10 KiB
C#
201 lines
10 KiB
C#
#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
|