#if UNITY_EDITOR using UnityEngine; using UnityEngine.UI; using UnityEditor; using UnityEditor.SceneManagement; using TMPro; using System.Reflection; using System.Linq; public static class CreateScannerScene { [MenuItem("Tools/Create Scanner Scene")] public static void Create() { var scene = EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); var services = new GameObject("[Services]"); services.AddComponent(); 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.05f, 0.05f, 0.08f), 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", "Card Scanner", 28, FontStyles.Bold, TextAlignmentOptions.Center); SetAnchors(title.GetComponent(), new Vector2(0.3f, 0.1f), new Vector2(0.7f, 0.9f)); // Camera feed (left) var camFeedGo = new GameObject("CameraFeedImage"); camFeedGo.transform.SetParent(canvasGo.transform, false); camFeedGo.AddComponent().color = Color.black; SetAnchors(camFeedGo.GetComponent(), new Vector2(0.01f, 0.20f), new Vector2(0.55f, 0.93f)); // Scan overlay (animated line placeholder) var scanOverlay = CreatePanel(canvasGo.transform, "ScanOverlay", new Color(0f, 0.8f, 0f, 0.35f)); SetAnchors(scanOverlay.GetComponent(), new Vector2(0.01f, 0.55f), new Vector2(0.55f, 0.57f)); scanOverlay.SetActive(false); // Camera status var camStatus = CreateTMPText(canvasGo.transform, "CameraStatusText", "Initializing camera...", 16, FontStyles.Normal, TextAlignmentOptions.Center); SetAnchors(camStatus.GetComponent(), new Vector2(0.01f, 0.15f), new Vector2(0.55f, 0.20f)); // Capture + toggle buttons var captureBtn = CreateTMPButton(canvasGo.transform, "CaptureButton", "Scan Card", new Color(0.15f, 0.6f, 0.15f)); SetAnchors(captureBtn.GetComponent(), new Vector2(0.05f, 0.07f), new Vector2(0.32f, 0.14f)); var toggleCamBtn = CreateTMPButton(canvasGo.transform, "ToggleCameraButton", "Flip Camera", new Color(0.2f, 0.3f, 0.5f)); SetAnchors(toggleCamBtn.GetComponent(), new Vector2(0.34f, 0.07f), new Vector2(0.54f, 0.14f)); // Result panel (right) var resultPanel = CreatePanel(canvasGo.transform, "ResultPanel", new Color(0.1f, 0.1f, 0.16f, 0.97f)); SetAnchors(resultPanel.GetComponent(), new Vector2(0.56f, 0.20f), new Vector2(0.99f, 0.93f)); var resultImg = new GameObject("ResultCardImage"); resultImg.transform.SetParent(resultPanel.transform, false); resultImg.AddComponent().color = new Color(0.15f, 0.15f, 0.2f); SetAnchors(resultImg.GetComponent(), new Vector2(0.03f, 0.55f), new Vector2(0.45f, 0.98f)); var rName = CreateTMPText(resultPanel.transform, "ResultCardName", "", 22, FontStyles.Bold, TextAlignmentOptions.Left); SetAnchors(rName.GetComponent(), new Vector2(0.48f, 0.88f), new Vector2(0.97f, 0.98f)); var rType = CreateTMPText(resultPanel.transform, "ResultTypeLine", "", 16, FontStyles.Italic, TextAlignmentOptions.Left); SetAnchors(rType.GetComponent(), new Vector2(0.48f, 0.80f), new Vector2(0.97f, 0.88f)); var rOracle = CreateTMPText(resultPanel.transform, "ResultOracleText","", 14, FontStyles.Normal, TextAlignmentOptions.TopLeft); SetAnchors(rOracle.GetComponent(), new Vector2(0.48f, 0.55f), new Vector2(0.97f, 0.80f)); var rStatus = CreateTMPText(resultPanel.transform, "ResultStatus", "", 14, FontStyles.Normal, TextAlignmentOptions.Left); SetAnchors(rStatus.GetComponent(), new Vector2(0.03f, 0.45f), new Vector2(0.97f, 0.55f)); var addCollBtn = CreateTMPButton(resultPanel.transform, "AddToCollectionButton", "Add to Collection", new Color(0.2f, 0.55f, 0.2f)); SetAnchors(addCollBtn.GetComponent(), new Vector2(0.03f, 0.03f), new Vector2(0.48f, 0.12f)); var addDeckBtn = CreateTMPButton(resultPanel.transform, "AddToDeckButton", "Add to Deck", new Color(0.2f, 0.3f, 0.6f)); SetAnchors(addDeckBtn.GetComponent(), new Vector2(0.52f, 0.03f), new Vector2(0.97f, 0.12f)); resultPanel.SetActive(false); // -- Save -- if (!AssetDatabase.IsValidFolder("Assets/Scenes")) AssetDatabase.CreateFolder("Assets", "Scenes"); string path = "Assets/Scenes/Scanner.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("[CreateScannerScene] Scanner 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