using UnityEngine; using UnityEngine.UI; using UnityEditor; namespace Northbound.Editor { public class NetworkUIBuilder { [MenuItem("GameObject/Network/Create Network Join UI")] public static void CreateNetworkJoinUI() { Canvas canvas = FindOrCreateCanvas(); GameObject panel = CreatePanel(canvas.transform); InputField ipInput = CreateInputField(panel.transform, "IP Input", "127.0.0.1", 150); InputField portInput = CreateInputField(panel.transform, "Port Input", "7777", 100); Button joinButton = CreateButton(panel.transform, "Join", new Vector2(0, -80)); Button hostButton = CreateButton(panel.transform, "Host", new Vector2(-60, -80)); Button disconnectButton = CreateButton(panel.transform, "Disconnect", new Vector2(60, -80)); Text statusText = CreateStatusText(panel.transform); NetworkJoinUI networkJoinUI = panel.AddComponent(); networkJoinUI.SetUIReferences(panel, ipInput, portInput, joinButton, hostButton, disconnectButton, statusText); Selection.activeGameObject = panel; Debug.Log("[NetworkUIBuilder] Network Join UI created!"); } private static Canvas FindOrCreateCanvas() { Canvas[] canvases = Object.FindObjectsByType(FindObjectsSortMode.None); if (canvases.Length > 0) { return canvases[0]; } GameObject canvasObj = new GameObject("NetworkCanvas"); Canvas canvas = canvasObj.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvasObj.AddComponent(); canvasObj.AddComponent(); return canvas; } private static GameObject CreatePanel(Transform parent) { GameObject panel = new GameObject("NetworkJoinPanel"); panel.transform.SetParent(parent, false); RectTransform rect = panel.AddComponent(); rect.anchorMin = new Vector2(0.5f, 0.5f); rect.anchorMax = new Vector2(0.5f, 0.5f); rect.pivot = new Vector2(0.5f, 0.5f); rect.sizeDelta = new Vector2(300, 250); rect.anchoredPosition = Vector2.zero; Image image = panel.AddComponent(); image.color = new Color(0.1f, 0.1f, 0.1f, 0.95f); return panel; } private static InputField CreateInputField(Transform parent, string name, string placeholder, float width) { GameObject fieldObj = new GameObject(name); fieldObj.transform.SetParent(parent, false); RectTransform rect = fieldObj.AddComponent(); rect.anchorMin = new Vector2(0.5f, 0.5f); rect.anchorMax = new Vector2(0.5f, 0.5f); rect.pivot = new Vector2(0.5f, 0.5f); rect.sizeDelta = new Vector2(width, 30); int yPos = name.Contains("IP") ? 80 : 40; rect.anchoredPosition = new Vector2(0, yPos); Image bgImage = fieldObj.AddComponent(); bgImage.color = new Color(0.2f, 0.2f, 0.2f, 1f); InputField inputField = fieldObj.AddComponent(); inputField.textComponent = CreateTextComponent(fieldObj.transform, ""); inputField.text = placeholder; inputField.contentType = InputField.ContentType.Standard; Text placeholderText = CreateTextComponent(fieldObj.transform, placeholder); placeholderText.color = new Color(0.5f, 0.5f, 0.5f, 0.5f); inputField.placeholder = placeholderText; Text label = CreateTextComponent(parent, name.ToUpper()); RectTransform labelRect = label.GetComponent(); labelRect.anchoredPosition = new Vector2(-width / 2 - 30, yPos); return inputField; } private static Button CreateButton(Transform parent, string text, Vector2 position) { GameObject buttonObj = new GameObject(text + "Button"); buttonObj.transform.SetParent(parent, false); RectTransform rect = buttonObj.AddComponent(); rect.anchorMin = new Vector2(0.5f, 0.5f); rect.anchorMax = new Vector2(0.5f, 0.5f); rect.pivot = new Vector2(0.5f, 0.5f); rect.sizeDelta = new Vector2(80, 30); rect.anchoredPosition = position; Image bgImage = buttonObj.AddComponent(); bgImage.color = new Color(0.3f, 0.5f, 0.8f, 1f); Button button = buttonObj.AddComponent