更新主界面
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user