From 08dec79a6e1c45d7ee70d582b6368b01b1307a93 Mon Sep 17 00:00:00 2001 From: ksh999000 <740612340@qq.com> Date: Sat, 4 Jul 2026 14:45:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=BB=93=E7=AE=97=E7=95=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unity/Assets/Editor/UIBuilder.cs | 227 +- unity/Assets/Light/scripts/LightMaskSystem.cs | 32 +- unity/Assets/Scenes/Gameplay.unity | 1602 +----- unity/Assets/Scenes/Scoring.scene | 4424 +++-------------- unity/Assets/UI/Art/ResultScreen/123456.png | Bin 0 -> 15915 bytes .../UI/Art/ResultScreen/123456.png.meta | 175 + unity/Assets/UI/Art/ResultScreen/bg.png | Bin 0 -> 4226511 bytes unity/Assets/UI/Art/ResultScreen/bg.png.meta | 175 + unity/Assets/UI/Art/ResultScreen/bgpoint.png | Bin 0 -> 3246 bytes .../UI/Art/ResultScreen/bgpoint.png.meta | 175 + unity/Assets/UI/Art/ResultScreen/line.png | Bin 0 -> 2762 bytes .../Assets/UI/Art/ResultScreen/line.png.meta | 175 + .../Assets/UI/Art/ResultScreen/nizuodaol.png | Bin 0 -> 31382 bytes .../UI/Art/ResultScreen/nizuodaol.png.meta | 175 + unity/Assets/UI/Art/ResultScreen/主界面.png | Bin 0 -> 71094 bytes .../UI/Art/ResultScreen/主界面.png.meta | 175 + unity/Assets/UI/Art/ResultScreen/拯救魂灵.png | Bin 0 -> 7828 bytes .../UI/Art/ResultScreen/拯救魂灵.png.meta | 175 + unity/Assets/UI/Art/ResultScreen/新纪录.png | Bin 0 -> 6108 bytes .../UI/Art/ResultScreen/新纪录.png.meta | 175 + unity/Assets/UI/Art/ResultScreen/预览.png | Bin 0 -> 4329615 bytes .../Assets/UI/Art/ResultScreen/预览.png.meta | 175 + unity/Assets/UI/DebugResultButtons.cs | 172 + unity/Assets/UI/DebugResultButtons.cs.meta | 11 + unity/Assets/UI/ScoringUIController.cs | 196 +- unity/Assets/eco/Prefabs/SpiritLantern.prefab | 2 +- unity/Assets/enemy/EnemyAI.cs | 62 +- unity/UserSettings/EditorUserSettings.asset | 8 +- 28 files changed, 3022 insertions(+), 5289 deletions(-) create mode 100644 unity/Assets/UI/Art/ResultScreen/123456.png create mode 100644 unity/Assets/UI/Art/ResultScreen/123456.png.meta create mode 100644 unity/Assets/UI/Art/ResultScreen/bg.png create mode 100644 unity/Assets/UI/Art/ResultScreen/bg.png.meta create mode 100644 unity/Assets/UI/Art/ResultScreen/bgpoint.png create mode 100644 unity/Assets/UI/Art/ResultScreen/bgpoint.png.meta create mode 100644 unity/Assets/UI/Art/ResultScreen/line.png create mode 100644 unity/Assets/UI/Art/ResultScreen/line.png.meta create mode 100644 unity/Assets/UI/Art/ResultScreen/nizuodaol.png create mode 100644 unity/Assets/UI/Art/ResultScreen/nizuodaol.png.meta create mode 100644 unity/Assets/UI/Art/ResultScreen/主界面.png create mode 100644 unity/Assets/UI/Art/ResultScreen/主界面.png.meta create mode 100644 unity/Assets/UI/Art/ResultScreen/拯救魂灵.png create mode 100644 unity/Assets/UI/Art/ResultScreen/拯救魂灵.png.meta create mode 100644 unity/Assets/UI/Art/ResultScreen/新纪录.png create mode 100644 unity/Assets/UI/Art/ResultScreen/新纪录.png.meta create mode 100644 unity/Assets/UI/Art/ResultScreen/预览.png create mode 100644 unity/Assets/UI/Art/ResultScreen/预览.png.meta create mode 100644 unity/Assets/UI/DebugResultButtons.cs create mode 100644 unity/Assets/UI/DebugResultButtons.cs.meta diff --git a/unity/Assets/Editor/UIBuilder.cs b/unity/Assets/Editor/UIBuilder.cs index a7d4ff8..15a5301 100644 --- a/unity/Assets/Editor/UIBuilder.cs +++ b/unity/Assets/Editor/UIBuilder.cs @@ -9,12 +9,13 @@ using GameFramework; /// 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; } + + /// + /// 在 Scoring 场景中搭建结算界面 Canvas。 + /// + [MenuItem("Tools/搭建 Scoring Canvas")] + public static void BuildScoringUI() + { + // 加载美术资源 + var bgSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/ResultScreen/bg.png"); + var winTitleSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/ResultScreen/nizuodaol.png"); + var newRecordSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/ResultScreen/新纪录.png"); + var scoreLabelSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/ResultScreen/拯救魂灵.png"); + var mainMenuBtnSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/ResultScreen/主界面.png"); + var lineSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/ResultScreen/line.png"); + var bgPointSprite = AssetDatabase.LoadAssetAtPath("Assets/UI/Art/ResultScreen/bgpoint.png"); + + // 创建 Scoring Canvas + var canvasObj = new GameObject("ScoringCanvas"); + 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(); + + // 添加 ScoringUIController 脚本 + var controller = canvasObj.AddComponent(); + var so = new SerializedObject(controller); + + // ===== 底图 ===== + var bgObj = new GameObject("Background"); + bgObj.transform.SetParent(canvasObj.transform, false); + var bgImg = bgObj.AddComponent(); + if (bgSprite != null) bgImg.sprite = bgSprite; + bgImg.preserveAspect = false; + var bgRect = bgObj.GetComponent(); + 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(); + 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(); + 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(); + so.FindProperty("soulCountBgSprite").objectReferenceValue = bgPointSprite; + + // 魂灵数量文字 + var soulText = CreateText(winPanel.transform, "SoulCountText", "0", 36, TextAnchor.MiddleCenter); + var soulTextRect = soulText.GetComponent(); + 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(); + + // 新记录图片 + 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(); + 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(); + 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(); + 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(); + 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(); + 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().anchoredPosition = new Vector2(0, 0); + so.FindProperty("finalScoreText").objectReferenceValue = finalScore.GetComponent(); + + // 排行榜容器 + var lbContainer = new GameObject("LeaderboardContainer"); + lbContainer.transform.SetParent(lbPanel.transform, false); + var lbContRect = lbContainer.AddComponent(); + lbContRect.anchorMin = Vector2.zero; + lbContRect.anchorMax = Vector2.one; + lbContRect.sizeDelta = Vector2.zero; + var lbLayout = lbContainer.AddComponent(); + 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(); + 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(); + 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().sizeDelta = new Vector2(200, 40); + nameInput.AddComponent().color = new Color(1, 1, 1, 0.8f); + var inputField = nameInput.AddComponent(); + var textArea = new GameObject("Text"); + textArea.transform.SetParent(nameInput.transform, false); + var taRect = textArea.AddComponent(); + taRect.anchorMin = Vector2.zero; + taRect.anchorMax = Vector2.one; + taRect.sizeDelta = Vector2.zero; + var taText = textArea.AddComponent(); + 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().anchoredPosition = new Vector2(-60, -50); + so.FindProperty("submitButton").objectReferenceValue = submitBtn.GetComponent