#if UNITY_EDITOR using System; using System.Linq; using AibisDream.UI; using TMPro; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; namespace AibisDream.DeveloperMode.Editor { public static class DeveloperModePanelBuilder { private const string PrefabPath = "Assets/GameContent/Feature_MainUI/Prefabs/DeveloperModePanel.prefab"; private const string ScenePath = "Assets/Scenes/Persistence.unity"; private const string FontAssetPath = "Assets/Font/Assets/WenQuanYi Bitmap Song 14px SDF.asset"; private static readonly Color Background = new(0.025f, 0.045f, 0.065f, 0.97f); private static readonly Color Surface = new(0.055f, 0.085f, 0.11f, 0.96f); private static readonly Color Accent = new(0.16f, 0.75f, 0.88f, 1f); private static readonly Color TextColor = new(0.88f, 0.96f, 1f, 1f); [MenuItem("Tools/AIBIS/Developer Mode/Rebuild Runtime Panel")] public static void BuildFromMenu() { Build(); Selection.activeObject = AssetDatabase.LoadAssetAtPath(PrefabPath); } public static void BuildFromCommandLine() { try { Build(); Debug.Log("[DeveloperModePanelBuilder] Build completed."); } catch (Exception ex) { Debug.LogException(ex); EditorApplication.Exit(1); } } private static void Build() { var root = BuildPrefabContents(); root.SetActive(false); PrefabUtility.SaveAsPrefabAsset(root, PrefabPath); UnityEngine.Object.DestroyImmediate(root); AssetDatabase.SaveAssets(); ReplaceSceneInstance(); AssetDatabase.SaveAssets(); } private static GameObject BuildPrefabContents() { var root = CreateUiObject("Developer Mode Panel", typeof(CanvasRenderer), typeof(Image), typeof(DeveloperModePanel)); var rootRect = root.GetComponent(); rootRect.anchorMin = new Vector2(1f, 0.5f); rootRect.anchorMax = new Vector2(1f, 0.5f); rootRect.pivot = new Vector2(1f, 0.5f); rootRect.anchoredPosition = new Vector2(-16f, 0f); rootRect.sizeDelta = new Vector2(840f, 760f); root.GetComponent().color = Background; var panel = root.GetComponent(); var header = CreatePanel("Header", root.transform, Surface); SetAnchors(header.GetComponent(), new Vector2(0f, 1f), new Vector2(1f, 1f), new Vector2(0f, -46f), Vector2.zero); var title = CreateText("Title", header.transform, "AIBIS DREAM / DEVELOPMENT MODE", 22f, FontStyles.Bold); SetAnchors(title.rectTransform, new Vector2(0f, 0f), new Vector2(1f, 1f), new Vector2(18f, 0f), new Vector2(-64f, 0f)); title.alignment = TextAlignmentOptions.MidlineLeft; var close = CreateButton("Close", header.transform, "×", 44f, 36f); var closeRect = close.GetComponent(); closeRect.anchorMin = new Vector2(1f, 0.5f); closeRect.anchorMax = new Vector2(1f, 0.5f); closeRect.pivot = new Vector2(1f, 0.5f); closeRect.anchoredPosition = new Vector2(-5f, 0f); closeRect.sizeDelta = new Vector2(44f, 36f); var tabs = CreateHorizontal("Tabs", root.transform, 4f, new RectOffset(4, 4, 3, 3)); SetAnchors(tabs.GetComponent(), new Vector2(0f, 1f), new Vector2(1f, 1f), new Vector2(0f, -88f), new Vector2(0f, -46f)); var tabNames = new[] { "概览", "日志", "Yarn 变量", "存档槽位", "显示与控制" }; var tabButtons = tabNames.Select(name => CreateButton($"Tab {name}", tabs.transform, name, 0f, 34f)).ToArray(); foreach (var button in tabButtons) { var layout = button.GetComponent(); layout.flexibleWidth = 1f; layout.preferredWidth = 0f; } var pageRoot = CreateUiObject("Pages", typeof(RectTransform)); pageRoot.transform.SetParent(root.transform, false); SetAnchors(pageRoot.GetComponent(), Vector2.zero, Vector2.one, new Vector2(8f, 8f), new Vector2(-8f, -94f)); var overview = BuildOverviewPage(pageRoot.transform, out var overviewRefs); var logs = BuildLogPage(pageRoot.transform, out var logRefs); var variables = BuildVariablePage(pageRoot.transform, out var variableRefs); var saves = BuildSavePage(pageRoot.transform, out var saveRefs); var display = BuildDisplayPage(pageRoot.transform, out var displayRefs); var pages = new[] { overview, logs, variables, saves, display }; foreach (var page in pages) { Stretch(page.GetComponent()); page.SetActive(false); } var serialized = new SerializedObject(panel); Set(serialized, "closeButton", close.GetComponent