using UnityEngine; using UnityEditor; using UnityEngine.UI; using GameFramework; /// /// 一键搭建游戏 UI:HUD Canvas + 游戏结果 Canvas + 主菜单标题。 /// 菜单路径:Tools > 搭建游戏UI /// public static class UIBuilder { [MenuItem("Tools/搭建游戏UI (HUD + ResultScreen + MainMenu标题)")] public static void BuildAll() { BuildHUD(); BuildResultScreen(); Debug.Log("[UIBuilder] 全部 UI 搭建完成!请在 Inspector 中检查引用是否正确。"); } /// /// 在 Gameplay 场景中搭建 HUD Canvas。 /// [MenuItem("Tools/搭建 HUD Canvas")] public static void BuildHUD() { // 创建 HUD Canvas var hudCanvasObj = new GameObject("HUD_Canvas"); var canvas = hudCanvasObj.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = 10001; hudCanvasObj.AddComponent().uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; hudCanvasObj.GetComponent().referenceResolution = new Vector2(1920, 1080); hudCanvasObj.AddComponent(); // 添加 GameHUD 脚本 var hud = hudCanvasObj.AddComponent(); // ===== 左上角:血量区域 ===== var healthArea = CreateChild(hudCanvasObj, "HealthArea", new Vector2(20, -20)); var healthLayout = healthArea.AddComponent(); healthLayout.spacing = 5; healthLayout.childForceExpandWidth = false; healthLayout.childForceExpandHeight = false; healthArea.AddComponent().verticalFit = ContentSizeFitter.FitMode.PreferredSize; // 血量 Slider var sliderObj = new GameObject("HealthSlider"); sliderObj.transform.SetParent(healthArea.transform, false); var slider = sliderObj.AddComponent(); slider.minValue = 0; slider.maxValue = 1; slider.value = 1; slider.interactable = false; var sliderRect = sliderObj.GetComponent(); sliderRect.sizeDelta = new Vector2(200, 20); // Slider 背景 var sliderBg = new GameObject("Background"); sliderBg.transform.SetParent(sliderObj.transform, false); var bgImage = sliderBg.AddComponent(); bgImage.color = new Color(0.2f, 0.2f, 0.2f, 0.8f); var bgRect = sliderBg.GetComponent(); bgRect.anchorMin = Vector2.zero; bgRect.anchorMax = Vector2.one; bgRect.sizeDelta = Vector2.zero; // Slider 填充区域 var fillArea = new GameObject("Fill Area"); fillArea.transform.SetParent(sliderObj.transform, false); var fillAreaRect = fillArea.AddComponent(); fillAreaRect.anchorMin = new Vector2(0, 0); fillAreaRect.anchorMax = new Vector2(1, 1); fillAreaRect.sizeDelta = Vector2.zero; var fill = new GameObject("Fill"); fill.transform.SetParent(fillArea.transform, false); var fillImage = fill.AddComponent(); fillImage.color = new Color(0.8f, 0.1f, 0.1f, 0.9f); var fillRect = fill.GetComponent(); fillRect.anchorMin = Vector2.zero; fillRect.anchorMax = Vector2.one; fillRect.sizeDelta = Vector2.zero; slider.fillRect = fillRect; // 血量文字 var healthTextObj = CreateText(healthArea.transform, "HealthText", "100/100", 14, TextAnchor.MiddleLeft); healthTextObj.GetComponent().sizeDelta = new Vector2(200, 20); // ===== 左上角下方:灵灯区域 ===== var lanternArea = CreateChild(hudCanvasObj, "LanternArea", new Vector2(20, -80)); var lanternLayout = lanternArea.AddComponent(); lanternLayout.spacing = 3; lanternLayout.childForceExpandWidth = false; lanternLayout.childForceExpandHeight = false; lanternArea.AddComponent().verticalFit = ContentSizeFitter.FitMode.PreferredSize; var lanternCountObj = CreateText(lanternArea.transform, "LanternCount", "灵灯: 5", 16, TextAnchor.MiddleLeft); lanternCountObj.GetComponent().sizeDelta = new Vector2(200, 24); var lanternCDObj = CreateText(lanternArea.transform, "LanternCD", "就绪", 14, TextAnchor.MiddleLeft); lanternCDObj.GetComponent().sizeDelta = new Vector2(200, 20); // ===== 右上角:分数 + 暂停 ===== var topRight = CreateChild(hudCanvasObj, "TopRight", new Vector2(-20, -20)); var topRightRect = topRight.GetComponent(); topRightRect.anchorMin = new Vector2(1, 1); topRightRect.anchorMax = new Vector2(1, 1); topRightRect.pivot = new Vector2(1, 1); var topRightLayout = topRight.AddComponent(); topRightLayout.spacing = 8; topRightLayout.childForceExpandWidth = false; topRightLayout.childForceExpandHeight = false; topRightLayout.childAlignment = TextAnchor.UpperRight; topRight.AddComponent().verticalFit = ContentSizeFitter.FitMode.PreferredSize; var scoreObj = CreateText(topRight.transform, "ScoreText", "分数: 0", 20, TextAnchor.MiddleRight); scoreObj.GetComponent().sizeDelta = new Vector2(200, 30); // 暂停按钮 var pauseObj = CreateButton(topRight.transform, "PauseButton", "暂停", new Vector2(100, 35)); // ===== 连接 GameHUD 引用 ===== var so = new SerializedObject(hud); so.FindProperty("healthSlider").objectReferenceValue = slider; so.FindProperty("healthText").objectReferenceValue = healthTextObj.GetComponent(); so.FindProperty("lanternCountText").objectReferenceValue = lanternCountObj.GetComponent(); so.FindProperty("lanternCDText").objectReferenceValue = lanternCDObj.GetComponent(); so.FindProperty("scoreText").objectReferenceValue = scoreObj.GetComponent(); so.FindProperty("pauseButton").objectReferenceValue = pauseObj.GetComponent