更新主界面

This commit is contained in:
2026-07-04 11:00:54 +08:00
parent a262f7512d
commit 58d1f54e0d
20 changed files with 1696 additions and 745 deletions
+131 -1
View File
@@ -9,14 +9,123 @@ using GameFramework;
/// </summary>
public static class UIBuilder
{
[MenuItem("Tools/搭建游戏UI (HUD + ResultScreen + MainMenu标题)")]
[MenuItem("Tools/搭建游戏UI (HUD + ResultScreen + MainMenu)")]
public static void BuildAll()
{
BuildMainMenu();
BuildHUD();
BuildResultScreen();
Debug.Log("[UIBuilder] 全部 UI 搭建完成!请在 Inspector 中检查引用是否正确。");
}
/// <summary>
/// 在 MainMenu 场景中搭建主菜单 Canvas。
/// </summary>
[MenuItem("Tools/搭建 MainMenu Canvas")]
public static void BuildMainMenu()
{
// 加载美术资源
var bgSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/MainMenu/bg.jpg");
var titleSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/MainMenu/title.png");
var startSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/MainMenu/kaishiyouxi.png");
var replaySprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/MainMenu/juqinghuifang.png");
var creditsSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/MainMenu/zhizuorenyuan.png");
// 创建 MainMenu Canvas
var canvasObj = new GameObject("MainMenu_Canvas");
var canvas = canvasObj.AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
canvas.sortingOrder = 0;
var scaler = canvasObj.AddComponent<CanvasScaler>();
scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
scaler.referenceResolution = new Vector2(1920, 1080);
canvasObj.AddComponent<GraphicRaycaster>();
// 添加 MainMenuUIController 脚本
var controller = canvasObj.AddComponent<MainMenuUIController>();
// ===== 背景图 =====
if (bgSprite != null)
{
var bgObj = new GameObject("Background");
bgObj.transform.SetParent(canvasObj.transform, false);
var bgImg = bgObj.AddComponent<Image>();
bgImg.sprite = bgSprite;
bgImg.preserveAspect = false;
var bgRect = bgObj.GetComponent<RectTransform>();
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<Image>();
titleImg.sprite = titleSprite;
titleImg.preserveAspect = true;
var titleRect = titleObj.GetComponent<RectTransform>();
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<RectTransform>();
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<VerticalLayoutGroup>();
layout.spacing = 20;
layout.childForceExpandWidth = false;
layout.childForceExpandHeight = false;
layout.childAlignment = TextAnchor.UpperCenter;
buttonArea.AddComponent<ContentSizeFitter>().verticalFit = ContentSizeFitter.FitMode.PreferredSize;
// 开始游戏按钮
Button startBtn = null;
if (startSprite != null)
{
var btn = CreateImageButton(buttonArea.transform, "StartButton", startSprite);
startBtn = btn.GetComponent<Button>();
}
// 剧情回放按钮
Button replayBtn = null;
if (replaySprite != null)
{
var btn = CreateImageButton(buttonArea.transform, "StoryReplayButton", replaySprite);
replayBtn = btn.GetComponent<Button>();
}
// 制作人员按钮
Button creditsBtn = null;
if (creditsSprite != null)
{
var btn = CreateImageButton(buttonArea.transform, "CreditsButton", creditsSprite);
creditsBtn = btn.GetComponent<Button>();
}
// ===== 连接 MainMenuUIController 引用 =====
var cso = new SerializedObject(controller);
cso.FindProperty("startButton").objectReferenceValue = startBtn;
cso.FindProperty("storyReplayButton").objectReferenceValue = replayBtn;
cso.FindProperty("creditsButton").objectReferenceValue = creditsBtn;
cso.ApplyModifiedProperties();
Debug.Log("[UIBuilder] MainMenu Canvas 搭建完成");
}
/// <summary>
/// 在 Gameplay 场景中搭建 HUD Canvas。
/// </summary>
@@ -252,6 +361,27 @@ public static class UIBuilder
return btnObj;
}
private static GameObject CreateImageButton(Transform parent, string name, Sprite sprite)
{
var btnObj = new GameObject(name);
btnObj.transform.SetParent(parent, false);
var rect = btnObj.AddComponent<RectTransform>();
// 根据 Sprite 原始尺寸设置按钮大小(缩小到合适尺寸)
float scale = 0.5f;
rect.sizeDelta = new Vector2(sprite.rect.width * scale, sprite.rect.height * scale);
var img = btnObj.AddComponent<Image>();
img.sprite = sprite;
img.preserveAspect = true;
var btn = btnObj.AddComponent<Button>();
// 设置按钮颜色过渡
var colors = btn.colors;
colors.normalColor = Color.white;
colors.highlightedColor = new Color(0.9f, 0.9f, 0.9f);
colors.pressedColor = new Color(0.7f, 0.7f, 0.7f);
btn.colors = colors;
return btnObj;
}
private static GameObject CreateCenterPanel(GameObject parent, string name, Color bgColor)
{
var panel = new GameObject(name);