#if UNITY_EDITOR using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; using UnityEditor; using UnityEditor.SceneManagement; using TMPro; using System.Reflection; using System.Linq; public static class CreateMainMenuScene { [MenuItem("Tools/Create MainMenu Scene")] public static void Create() { // -- Create new scene -- var scene = EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); // -- Services (persistent singletons) -- var services = new GameObject("[Services]"); services.AddComponent(); services.AddComponent(); // -- Canvas -- var canvasGo = new GameObject("Canvas"); var canvas = canvasGo.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; var scaler = canvasGo.AddComponent(); scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; scaler.referenceResolution = new Vector2(1920, 1080); canvasGo.AddComponent(); // -- Event System -- if (Object.FindObjectOfType() == null) { var es = new GameObject("EventSystem"); es.AddComponent(); es.AddComponent(); } // -- Background -- var bg = CreatePanel(canvasGo.transform, "Background", Color.black, stretch: true); bg.GetComponent().color = new Color(0.08f, 0.08f, 0.12f, 1f); // -- Server Panel (top) -- var serverPanel = CreatePanel(canvasGo.transform, "ServerPanel", new Color(0.12f, 0.12f, 0.18f, 0.95f)); var spRect = serverPanel.GetComponent(); SetAnchors(spRect, new Vector2(0.1f, 0.75f), new Vector2(0.9f, 0.95f)); var logoText = CreateTMPText(serverPanel.transform, "LogoText", "Commander AI Lab", 36, FontStyles.Bold, TextAlignmentOptions.Center); SetAnchors(logoText.GetComponent(), new Vector2(0f, 0.5f), new Vector2(1f, 1f)); var urlInput = CreateTMPInputField(serverPanel.transform, "ServerUrlInput", "http://localhost:8080"); var urlRect = urlInput.GetComponent(); SetAnchors(urlRect, new Vector2(0.05f, 0.05f), new Vector2(0.55f, 0.45f)); var connectBtn = CreateTMPButton(serverPanel.transform, "ConnectButton", "Connect", new Color(0.2f, 0.6f, 0.2f)); SetAnchors(connectBtn.GetComponent(), new Vector2(0.58f, 0.05f), new Vector2(0.75f, 0.45f)); var statusImg = new GameObject("StatusIndicator"); statusImg.transform.SetParent(serverPanel.transform, false); var statusImage = statusImg.AddComponent(); statusImage.color = new Color(0.8f, 0.2f, 0.2f); var siRect = statusImg.GetComponent(); SetAnchors(siRect, new Vector2(0.78f, 0.15f), new Vector2(0.80f, 0.35f)); var statusText = CreateTMPText(serverPanel.transform, "StatusText", "Disconnected", 18, FontStyles.Normal, TextAlignmentOptions.Left); SetAnchors(statusText.GetComponent(), new Vector2(0.81f, 0.05f), new Vector2(0.98f, 0.45f)); // -- Nav Panel (center) -- var navPanel = CreatePanel(canvasGo.transform, "NavPanel", new Color(0.1f, 0.1f, 0.15f, 0.9f)); SetAnchors(navPanel.GetComponent(), new Vector2(0.1f, 0.15f), new Vector2(0.9f, 0.72f)); // Add vertical layout var vlg = navPanel.AddComponent(); vlg.spacing = 10; vlg.padding = new RectOffset(40, 40, 20, 20); vlg.childAlignment = TextAnchor.MiddleCenter; vlg.childForceExpandWidth = true; vlg.childForceExpandHeight = true; string[] btnNames = { "CollectionButton", "DeckBuilderButton", "DeckGenButton", "SimulatorButton", "ScannerButton", "CoachButton", "TrainingButton" }; string[] btnLabels = { "Collection", "Deck Builder", "Deck Generator", "Simulator", "Scanner", "Coach", "Training" }; var navButtons = new GameObject[btnNames.Length]; for (int i = 0; i < btnNames.Length; i++) { navButtons[i] = CreateTMPButton(navPanel.transform, btnNames[i], btnLabels[i], new Color(0.18f, 0.22f, 0.35f)); } // -- Error Panel (bottom, inactive) -- var errorPanel = CreatePanel(canvasGo.transform, "ErrorPanel", new Color(0.5f, 0.1f, 0.1f, 0.95f)); SetAnchors(errorPanel.GetComponent(), new Vector2(0.2f, 0.02f), new Vector2(0.8f, 0.12f)); var errorText = CreateTMPText(errorPanel.transform, "ErrorText", "", 16, FontStyles.Normal, TextAlignmentOptions.Center); SetAnchors(errorText.GetComponent(), new Vector2(0f, 0.3f), new Vector2(0.7f, 1f)); var retryBtn = CreateTMPButton(errorPanel.transform, "RetryButton", "Retry", new Color(0.6f, 0.3f, 0.1f)); SetAnchors(retryBtn.GetComponent(), new Vector2(0.72f, 0.15f), new Vector2(0.95f, 0.85f)); errorPanel.SetActive(false); // -- Wire up MainMenuController -- var controllerGo = new GameObject("MainMenuController"); var controller = controllerGo.AddComponent(); // Use reflection to set private serialized fields SetField(controller, "serverUrlInput", urlInput.GetComponent()); SetField(controller, "connectButton", connectBtn.GetComponent