using UnityEngine; using UnityEditor; using UnityEngine.UI; using TMPro; using GameFramework; using Architecture.Core; /// /// 一键搭建游戏 UI:HUD Canvas + 游戏结果 Canvas + 主菜单标题。 /// 菜单路径:Tools > 搭建游戏UI /// public static class UIBuilder { [MenuItem("Tools/搭建游戏UI (HUD + ResultScreen + MainMenu + Scoring)")] public static void BuildAll() { BuildMainMenu(); BuildHUD(); BuildResultScreen(); BuildScoringUI(); Debug.Log("[UIBuilder] 全部 UI 搭建完成!请在 Inspector 中检查引用是否正确。"); } /// /// 在 MainMenu 场景中搭建主菜单 Canvas。 /// [MenuItem("Tools/搭建 MainMenu Canvas")] public static void BuildMainMenu() { // 加载美术资源 var bgSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/MainMenu/bg.jpg"); var titleSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/MainMenu/title.png"); var startSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/MainMenu/kaishiyouxi.png"); var replaySprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/MainMenu/juqinghuifang.png"); var creditsSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/MainMenu/zhizuorenyuan.png"); // 创建 MainMenu Canvas var canvasObj = new GameObject("MainMenu_Canvas"); var canvas = canvasObj.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.sortingOrder = 0; var scaler = canvasObj.AddComponent(); scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; scaler.referenceResolution = new Vector2(1920, 1080); canvasObj.AddComponent(); // 添加 MainMenuUIController 脚本 var controller = canvasObj.AddComponent(); // ===== 背景图 ===== if (bgSprite != null) { var bgObj = new GameObject("Background"); bgObj.transform.SetParent(canvasObj.transform, false); var bgImg = bgObj.AddComponent(); bgImg.sprite = bgSprite; bgImg.preserveAspect = false; var bgRect = bgObj.GetComponent(); bgRect.anchorMin = Vector2.zero; bgRect.anchorMax = Vector2.one; bgRect.sizeDelta = Vector2.zero; } // ===== 标题图片 ===== if (titleSprite != null) { var titleObj = new GameObject("TitleImage"); titleObj.transform.SetParent(canvasObj.transform, false); var titleImg = titleObj.AddComponent(); titleImg.sprite = titleSprite; titleImg.preserveAspect = true; var titleRect = titleObj.GetComponent(); titleRect.anchorMin = new Vector2(0.5f, 0.65f); titleRect.anchorMax = new Vector2(0.5f, 0.65f); titleRect.pivot = new Vector2(0.5f, 0.5f); titleRect.sizeDelta = new Vector2(titleSprite.rect.width * 0.5f, titleSprite.rect.height * 0.5f); // 连接 titleImage 引用 var so = new SerializedObject(controller); so.FindProperty("titleImage").objectReferenceValue = titleImg; so.ApplyModifiedProperties(); } // ===== 按钮区域(居中偏下) ===== var buttonArea = new GameObject("ButtonArea"); buttonArea.transform.SetParent(canvasObj.transform, false); var areaRect = buttonArea.AddComponent(); areaRect.anchorMin = new Vector2(0.5f, 0.15f); areaRect.anchorMax = new Vector2(0.5f, 0.15f); areaRect.pivot = new Vector2(0.5f, 0.5f); var layout = buttonArea.AddComponent(); layout.spacing = 20; layout.childForceExpandWidth = false; layout.childForceExpandHeight = false; layout.childAlignment = TextAnchor.UpperCenter; buttonArea.AddComponent().verticalFit = ContentSizeFitter.FitMode.PreferredSize; // 开始游戏按钮 Button startBtn = null; if (startSprite != null) { var btn = CreateImageButton(buttonArea.transform, "StartButton", startSprite); startBtn = btn.GetComponent