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