#if UNITY_EDITOR using UnityEngine; using UnityEngine.UI; using UnityEditor; using UnityEditor.SceneManagement; using TMPro; using System.Reflection; using System.Linq; public static class CreateSimulatorScene { [MenuItem("Tools/Create Simulator Scene")] public static void Create() { var scene = EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); var services = new GameObject("[Services]"); services.AddComponent(); 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(); if (Object.FindObjectOfType() == null) { var es = new GameObject("EventSystem"); es.AddComponent(); es.AddComponent(); } CreatePanel(canvasGo.transform, "Background", new Color(0.08f, 0.08f, 0.12f), stretch: true); // Header var header = CreatePanel(canvasGo.transform, "Header", new Color(0.12f, 0.12f, 0.18f)); SetAnchors(header.GetComponent(), new Vector2(0f, 0.93f), new Vector2(1f, 1f)); var backBtn = CreateTMPButton(header.transform, "BackButton", "< Back", new Color(0.2f, 0.2f, 0.3f)); SetAnchors(backBtn.GetComponent(), new Vector2(0.01f, 0.1f), new Vector2(0.08f, 0.9f)); var title = CreateTMPText(header.transform, "TitleText", "Simulator", 28, FontStyles.Bold, TextAlignmentOptions.Center); SetAnchors(title.GetComponent(), new Vector2(0.3f, 0.1f), new Vector2(0.7f, 0.9f)); // Config Panel var configPanel = CreatePanel(canvasGo.transform, "ConfigPanel", new Color(0.1f, 0.1f, 0.16f)); SetAnchors(configPanel.GetComponent(), new Vector2(0.05f, 0.35f), new Vector2(0.5f, 0.93f)); var cfgVlg = configPanel.AddComponent(); cfgVlg.padding = new RectOffset(16, 16, 16, 16); cfgVlg.spacing = 10; cfgVlg.childForceExpandWidth = true; cfgVlg.childForceExpandHeight = false; CreateTMPText(configPanel.transform, "ConfigTitle", "Simulation Config", 20, FontStyles.Bold, TextAlignmentOptions.Center); // Deck selector var deckLabel = CreateTMPText(configPanel.transform, "DeckLabel", "Deck:", 16, FontStyles.Normal, TextAlignmentOptions.Left); var deckInput = CreateTMPInputField(configPanel.transform, "DeckInput", "Deck ID or name..."); // Num games var gamesLabel = CreateTMPText(configPanel.transform, "GamesLabel", "Games:", 16, FontStyles.Normal, TextAlignmentOptions.Left); var gamesInput = CreateTMPInputField(configPanel.transform, "GamesInput", "100"); // Start/Stop buttons var startBtn = CreateTMPButton(configPanel.transform, "StartButton", "Start Simulation", new Color(0.2f, 0.55f, 0.2f)); var stopBtn = CreateTMPButton(configPanel.transform, "StopButton", "Stop", new Color(0.55f, 0.2f, 0.2f)); // Results Panel var resultsPanel = CreatePanel(canvasGo.transform, "ResultsPanel", new Color(0.1f, 0.1f, 0.16f)); SetAnchors(resultsPanel.GetComponent(), new Vector2(0.52f, 0.35f), new Vector2(0.95f, 0.93f)); var resultsTitle = CreateTMPText(resultsPanel.transform, "ResultsTitle", "Results", 20, FontStyles.Bold, TextAlignmentOptions.Center); SetAnchors(resultsTitle.GetComponent(), new Vector2(0f, 0.90f), new Vector2(1f, 1f)); var statusText = CreateTMPText(resultsPanel.transform, "StatusText", "Ready", 16, FontStyles.Normal, TextAlignmentOptions.TopLeft); SetAnchors(statusText.GetComponent(), new Vector2(0.03f, 0.03f), new Vector2(0.97f, 0.90f)); // Progress bar var progressBg = CreatePanel(canvasGo.transform, "ProgressBar", new Color(0.2f, 0.2f, 0.25f)); SetAnchors(progressBg.GetComponent(), new Vector2(0.05f, 0.28f), new Vector2(0.95f, 0.33f)); var progressFill = CreatePanel(progressBg.transform, "ProgressFill", new Color(0.2f, 0.6f, 0.3f)); SetAnchors(progressFill.GetComponent(), new Vector2(0f, 0f), new Vector2(0f, 1f)); var progressText = CreateTMPText(progressBg.transform, "ProgressText", "0%", 14, FontStyles.Normal, TextAlignmentOptions.Center); SetAnchors(progressText.GetComponent(), new Vector2(0f, 0f), new Vector2(1f, 1f)); // -- Save -- if (!AssetDatabase.IsValidFolder("Assets/Scenes")) AssetDatabase.CreateFolder("Assets", "Scenes"); string path = "Assets/Scenes/Simulator.unity"; EditorSceneManager.SaveScene(scene, path); var existing = new System.Collections.Generic.List(EditorBuildSettings.scenes); if (!existing.Any(s => s.path == path)) existing.Add(new EditorBuildSettingsScene(path, true)); EditorBuildSettings.scenes = existing.ToArray(); Debug.Log("[CreateSimulatorScene] Simulator scene created and saved to " + path); } // -- Helpers -- static void SetAnchors(RectTransform rt, Vector2 min, Vector2 max) { rt.anchorMin = min; rt.anchorMax = max; rt.offsetMin = Vector2.zero; rt.offsetMax = Vector2.zero; } static GameObject CreatePanel(Transform parent, string name, Color color, bool stretch = false) { var go = new GameObject(name); go.transform.SetParent(parent, false); var img = go.AddComponent(); img.color = color; var rt = go.GetComponent(); if (stretch) SetAnchors(rt, Vector2.zero, Vector2.one); return go; } static GameObject CreateTMPText(Transform parent, string name, string text, int fontSize, FontStyles style, TextAlignmentOptions alignment) { var go = new GameObject(name); go.transform.SetParent(parent, false); var tmp = go.AddComponent(); tmp.text = text; tmp.fontSize = fontSize; tmp.fontStyle = style; tmp.alignment = alignment; tmp.color = Color.white; var rt = go.GetComponent(); SetAnchors(rt, Vector2.zero, Vector2.one); return go; } static GameObject CreateTMPButton(Transform parent, string name, string label, Color bgColor) { var go = new GameObject(name); go.transform.SetParent(parent, false); var img = go.AddComponent(); img.color = bgColor; var btn = go.AddComponent