更新结算界面

This commit is contained in:
2026-07-04 14:45:52 +08:00
parent 0b6dc2653f
commit 08dec79a6e
28 changed files with 3022 additions and 5289 deletions
+226 -1
View File
@@ -9,12 +9,13 @@ using GameFramework;
/// </summary>
public static class UIBuilder
{
[MenuItem("Tools/搭建游戏UI (HUD + ResultScreen + MainMenu)")]
[MenuItem("Tools/搭建游戏UI (HUD + ResultScreen + MainMenu + Scoring)")]
public static void BuildAll()
{
BuildMainMenu();
BuildHUD();
BuildResultScreen();
BuildScoringUI();
Debug.Log("[UIBuilder] 全部 UI 搭建完成!请在 Inspector 中检查引用是否正确。");
}
@@ -457,4 +458,228 @@ public static class UIBuilder
img.color = bgColor;
return panel;
}
/// <summary>
/// 在 Scoring 场景中搭建结算界面 Canvas。
/// </summary>
[MenuItem("Tools/搭建 Scoring Canvas")]
public static void BuildScoringUI()
{
// 加载美术资源
var bgSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/ResultScreen/bg.png");
var winTitleSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/ResultScreen/nizuodaol.png");
var newRecordSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/ResultScreen/新纪录.png");
var scoreLabelSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/ResultScreen/拯救魂灵.png");
var mainMenuBtnSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/ResultScreen/主界面.png");
var lineSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/ResultScreen/line.png");
var bgPointSprite = AssetDatabase.LoadAssetAtPath<Sprite>("Assets/UI/Art/ResultScreen/bgpoint.png");
// 创建 Scoring Canvas
var canvasObj = new GameObject("ScoringCanvas");
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>();
// 添加 ScoringUIController 脚本
var controller = canvasObj.AddComponent<ScoringUIController>();
var so = new SerializedObject(controller);
// ===== 底图 =====
var bgObj = new GameObject("Background");
bgObj.transform.SetParent(canvasObj.transform, false);
var bgImg = bgObj.AddComponent<Image>();
if (bgSprite != null) bgImg.sprite = bgSprite;
bgImg.preserveAspect = false;
var bgRect = bgObj.GetComponent<RectTransform>();
bgRect.anchorMin = Vector2.zero;
bgRect.anchorMax = Vector2.one;
bgRect.sizeDelta = Vector2.zero;
so.FindProperty("bgImage").objectReferenceValue = bgImg;
so.FindProperty("bgSprite").objectReferenceValue = bgSprite;
// ===== 胜利面板 =====
var winPanel = new GameObject("WinPanel");
winPanel.transform.SetParent(canvasObj.transform, false);
var winRect = winPanel.AddComponent<RectTransform>();
winRect.anchorMin = Vector2.zero;
winRect.anchorMax = Vector2.one;
winRect.sizeDelta = Vector2.zero;
winPanel.SetActive(false);
// "你做到了" 标题
var winTitle = CreateImageChild(winPanel.transform, "WinTitle", winTitleSprite, new Vector2(400, 80), new Vector2(0.5f, 0.75f));
so.FindProperty("winTitleImage").objectReferenceValue = winTitle.GetComponent<Image>();
so.FindProperty("winTitleSprite").objectReferenceValue = winTitleSprite;
// 魂灵数量底图
var soulBg = CreateImageChild(winPanel.transform, "SoulCountBg", bgPointSprite, new Vector2(200, 50), new Vector2(0.5f, 0.55f));
so.FindProperty("soulCountBgImage").objectReferenceValue = soulBg.GetComponent<Image>();
so.FindProperty("soulCountBgSprite").objectReferenceValue = bgPointSprite;
// 魂灵数量文字
var soulText = CreateText(winPanel.transform, "SoulCountText", "0", 36, TextAnchor.MiddleCenter);
var soulTextRect = soulText.GetComponent<RectTransform>();
soulTextRect.anchorMin = new Vector2(0.5f, 0.55f);
soulTextRect.anchorMax = new Vector2(0.5f, 0.55f);
soulTextRect.sizeDelta = new Vector2(100, 50);
so.FindProperty("soulCountText").objectReferenceValue = soulText.GetComponent<Text>();
// 新记录图片
var newRecord = CreateImageChild(winPanel.transform, "NewRecord", newRecordSprite, new Vector2(150, 40), new Vector2(0.5f, 0.45f));
newRecord.SetActive(false);
so.FindProperty("newRecordImage").objectReferenceValue = newRecord.GetComponent<Image>();
so.FindProperty("newRecordSprite").objectReferenceValue = newRecordSprite;
// 拯救魂灵标签
var scoreLabel = CreateImageChild(winPanel.transform, "ScoreLabel", scoreLabelSprite, new Vector2(200, 40), new Vector2(0.5f, 0.65f));
so.FindProperty("scoreLabelImage").objectReferenceValue = scoreLabel.GetComponent<Image>();
so.FindProperty("scoreLabelSprite").objectReferenceValue = scoreLabelSprite;
so.FindProperty("winPanel").objectReferenceValue = winPanel;
// ===== 失败面板 =====
var losePanel = new GameObject("LosePanel");
losePanel.transform.SetParent(canvasObj.transform, false);
var loseRect = losePanel.AddComponent<RectTransform>();
loseRect.anchorMin = Vector2.zero;
loseRect.anchorMax = Vector2.one;
loseRect.sizeDelta = Vector2.zero;
losePanel.SetActive(false);
// "你迷失了" 标题(暂用 nizuodaol.png 副本)
var loseTitle = CreateImageChild(losePanel.transform, "LoseTitle", winTitleSprite, new Vector2(400, 80), new Vector2(0.5f, 0.6f));
so.FindProperty("loseTitleImage").objectReferenceValue = loseTitle.GetComponent<Image>();
so.FindProperty("loseTitleSprite").objectReferenceValue = winTitleSprite;
so.FindProperty("losePanel").objectReferenceValue = losePanel;
// ===== 排行榜面板 =====
var lbPanel = new GameObject("LeaderboardPanel");
lbPanel.transform.SetParent(canvasObj.transform, false);
var lbRect = lbPanel.AddComponent<RectTransform>();
lbRect.anchorMin = new Vector2(0.3f, 0.1f);
lbRect.anchorMax = new Vector2(0.7f, 0.4f);
lbRect.sizeDelta = Vector2.zero;
lbPanel.SetActive(false);
so.FindProperty("leaderboardPanel").objectReferenceValue = lbPanel;
// 最终分数
var finalScore = CreateText(lbPanel.transform, "FinalScore", "0", 24, TextAnchor.MiddleCenter);
finalScore.GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
so.FindProperty("finalScoreText").objectReferenceValue = finalScore.GetComponent<Text>();
// 排行榜容器
var lbContainer = new GameObject("LeaderboardContainer");
lbContainer.transform.SetParent(lbPanel.transform, false);
var lbContRect = lbContainer.AddComponent<RectTransform>();
lbContRect.anchorMin = Vector2.zero;
lbContRect.anchorMax = Vector2.one;
lbContRect.sizeDelta = Vector2.zero;
var lbLayout = lbContainer.AddComponent<VerticalLayoutGroup>();
lbLayout.spacing = 2;
lbLayout.childForceExpandHeight = true;
so.FindProperty("leaderboardContainer").objectReferenceValue = lbContainer.transform;
// 创建10个排行榜条目
for (int i = 0; i < 10; i++)
{
var entry = new GameObject($"Entry_{i}");
entry.transform.SetParent(lbContainer.transform, false);
var entryLayout = entry.AddComponent<HorizontalLayoutGroup>();
entryLayout.spacing = 10;
entryLayout.childForceExpandWidth = true;
entryLayout.childForceExpandHeight = true;
CreateText(entry.transform, "Rank", $"{i + 1}.", 14, TextAnchor.MiddleCenter);
CreateText(entry.transform, "Score", "---", 14, TextAnchor.MiddleCenter);
CreateText(entry.transform, "Name", "---", 14, TextAnchor.MiddleCenter);
}
// ===== 新纪录输入面板 =====
var nhsPanel = new GameObject("NewHighScorePanel");
nhsPanel.transform.SetParent(canvasObj.transform, false);
var nhsRect = nhsPanel.AddComponent<RectTransform>();
nhsRect.anchorMin = new Vector2(0.3f, 0.3f);
nhsRect.anchorMax = new Vector2(0.7f, 0.5f);
nhsRect.sizeDelta = Vector2.zero;
nhsPanel.SetActive(false);
so.FindProperty("newHighScorePanel").objectReferenceValue = nhsPanel;
var nameInput = new GameObject("NameInput");
nameInput.transform.SetParent(nhsPanel.transform, false);
nameInput.AddComponent<RectTransform>().sizeDelta = new Vector2(200, 40);
nameInput.AddComponent<Image>().color = new Color(1, 1, 1, 0.8f);
var inputField = nameInput.AddComponent<InputField>();
var textArea = new GameObject("Text");
textArea.transform.SetParent(nameInput.transform, false);
var taRect = textArea.AddComponent<RectTransform>();
taRect.anchorMin = Vector2.zero;
taRect.anchorMax = Vector2.one;
taRect.sizeDelta = Vector2.zero;
var taText = textArea.AddComponent<Text>();
taText.text = "";
taText.alignment = TextAnchor.MiddleCenter;
taText.color = Color.black;
inputField.textComponent = taText;
so.FindProperty("nameInputField").objectReferenceValue = inputField;
var submitBtn = CreateButton(nhsPanel.transform, "SubmitButton", "提交", new Vector2(100, 40));
submitBtn.GetComponent<RectTransform>().anchoredPosition = new Vector2(-60, -50);
so.FindProperty("submitButton").objectReferenceValue = submitBtn.GetComponent<Button>();
var cancelBtn = CreateButton(nhsPanel.transform, "CancelButton", "取消", new Vector2(100, 40));
cancelBtn.GetComponent<RectTransform>().anchoredPosition = new Vector2(60, -50);
so.FindProperty("cancelButton").objectReferenceValue = cancelBtn.GetComponent<Button>();
// ===== 装饰 =====
var lineObj = CreateImageChild(canvasObj.transform, "Line", lineSprite, new Vector2(300, 4), new Vector2(0.5f, 0.5f));
so.FindProperty("lineImage").objectReferenceValue = lineObj.GetComponent<Image>();
so.FindProperty("lineSprite").objectReferenceValue = lineSprite;
var bgPointObj = CreateImageChild(canvasObj.transform, "BgPoint", bgPointSprite, new Vector2(60, 60), new Vector2(0.15f, 0.85f));
so.FindProperty("bgPointImage").objectReferenceValue = bgPointObj.GetComponent<Image>();
so.FindProperty("bgPointSprite").objectReferenceValue = bgPointSprite;
// ===== 返回主菜单按钮 =====
var menuBtn = CreateButton(canvasObj.transform, "MainMenuButton", "返回主菜单", new Vector2(160, 50));
var menuBtnRect = menuBtn.GetComponent<RectTransform>();
menuBtnRect.anchorMin = new Vector2(0.5f, 0.05f);
menuBtnRect.anchorMax = new Vector2(0.5f, 0.05f);
menuBtnRect.pivot = new Vector2(0.5f, 0.5f);
so.FindProperty("mainMenuButton").objectReferenceValue = menuBtn.GetComponent<Button>();
// 设置按钮图片
if (mainMenuBtnSprite != null)
{
var btnImg = menuBtn.GetComponent<Image>();
btnImg.sprite = mainMenuBtnSprite;
so.FindProperty("mainMenuButtonImage").objectReferenceValue = btnImg;
so.FindProperty("mainMenuBtnSprite").objectReferenceValue = mainMenuBtnSprite;
}
so.ApplyModifiedProperties();
Debug.Log("[UIBuilder] Scoring Canvas 搭建完成");
}
private static GameObject CreateImageChild(Transform parent, string name, Sprite sprite, Vector2 size, Vector2 anchor)
{
var obj = new GameObject(name);
obj.transform.SetParent(parent, false);
var rect = obj.AddComponent<RectTransform>();
rect.anchorMin = anchor;
rect.anchorMax = anchor;
rect.pivot = new Vector2(0.5f, 0.5f);
rect.sizeDelta = size;
var img = obj.AddComponent<Image>();
if (sprite != null)
{
img.sprite = sprite;
img.preserveAspect = true;
}
return obj;
}
}