iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
Vibe Coding

從課堂半成品到完整發布:獨立遊戲的30天重生記系列 第 25 篇

【DAY25】Unity 2D 敘事遊戲開發:遊戲內道具觸發與彈窗通知回饋(Achievement System Part 3 - In-Game Triggers & Popup UI)

  • 分享至 

  • xImage
  •  

一、前言
在昨天完成主選單的成就列表、格狀排版與灰階視覺化後,今天我們要進一步處理遊戲內部的觸發機制與即時彈窗通知。當玩家在遊戲中達成特定條件(例如拿到關鍵道具、觸發特定事件)時,系統不僅要記錄成就,還要能在畫面右上角跳出即時的解鎖通知,提升遊戲的互動回饋感!

二、成就彈窗 UI 與 Prefab 設計
為了讓玩家在遊戲進行中獲得即時回饋,我們建立了一個輕量化的彈窗通知介面:

  • 彈窗結構 (AchievementPopup Prefab): 包含背景圖示、成就圖示 (IconImage)、標題 (TitleText) 與副標題提示。
  • 位置與動畫預留: 將 Prefab 放置於遊戲的常駐畫布 (PersistentCanvas) 中,透過腳本控制其顯示與隱藏(或淡入淡出)。
    https://ithelp.ithome.com.tw/upload/images/20261001/20184073vUDiqRkvjC.png
    圖一、彈窗結構示意圖

三、核心程式實作:AchievementPopup & 觸發管理

  1. 我們建立了 AchievementPopup.cs 來控制彈窗的顯示邏輯,並透過協程(Coroutine)讓彈窗在顯示數秒後自動關閉。
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System.Collections;
public class AchievementPopup : MonoBehaviour {
    [Header("UI 元件參考")]
    [SerializeField] private Image iconImage;
    [SerializeField] private TextMeshProUGUI titleText;
    [SerializeField] private TextMeshProUGUI descText;
    [SerializeField] private GameObject popupPanel;

    // 顯示成就秒數
    [Header("顯示設定")]
    [SerializeField] private float displayDuration = 10f;

    private void Start() {
        if (popupPanel != null) popupPanel.SetActive(false);
    }

    // 顯示成就解鎖彈窗
    public void ShowPopup(AchievementData data)  {
        StopAllCoroutines();
        StartCoroutine(PopupRoutine(data));
    }
    private IEnumerator PopupRoutine(AchievementData data) {
        iconImage.sprite = data.iconSprite;
        titleText.text = "解鎖成就:" + data.achievementName;
        descText.text = data.description;
        popupPanel.SetActive(true);

        // 等待指定秒數後關閉
        yield return new WaitForSeconds(displayDuration);
        popupPanel.SetActive(false);
    }
}
  1. 接著在全域管理器中擴充解鎖方法,當成就解鎖時自動呼叫彈窗:
public void UnlockAchievement(string achievementID) {
AchievementData target = achievement.Find(a => a.achievementID == achievementID
if(target != null && !target.isUnlocked) {
target.isUnlocked = true ;

//觸發彈窗通知
if (popupUI !=null) {
popupUI.Showpopup(target);
}
SaveAchievementData();
   }
}
  1. 對話系統整合成就觸發-我們在原本控制對話與段落的結構(如 DialogueSegment 或對話資料類別)中,新增一個字串欄位 unlockAchievementID:
[System.Serializable]
public class DialogueSegment {
[TextArea(2, 5)] public string text;
public AudioClip segmentSFX;
public Sprite characterSprite;

[Header"成就解鎖設定"]
public string unlockAchievementID; //填入對應的成就ID
  1. 接著在對話播放器或流程管理器(例如 StoryFlowManager)播放到該段落時,順便檢查並觸發成就:
pubilc void ShowSegmentText(DialogueSegment segment) {
dialogueText.text = segment.text;
//播放語音、切換圖片等邏輯...

//如果該段落設定了成就ID,則直接觸發解鎖
if (!string.IsNullOrEmpty(segment.unlockAchievementID)) {
AchievementManager.Instance.UnlockAchievement(segment.unlockAchievementID);
  }
}

四、Unity Editor 與事件串接步驟(以第12幕--「兒子的禮物」成就為例)
為了讓成就系統與遊戲內容完整串接,我們需要在 Unity Editor 進行以下設定:
1. 建立並配置彈窗 Prefab:

  • 在 UI 畫布中設計好通知面板,掛載 AchievementPopup.cs 腳本。
  • 將對應的 Image 與 Text 欄位拖入 Inspector 中完成參照。
    2. 串接全域管理器:
  • 將場景中的 AchievementPopup 參考指定給主管理器 (AchievementManager),確保解鎖時能順利呼叫。
    https://ithelp.ithome.com.tw/upload/images/20261001/201840730UYFEwdQvp.png
    圖二、AchievementPopup掛進AchievementManager

3. 在對話管理器中掛載成就 ID:

  • 打開對話場景(如第 12 幕的 StoryFlowManager),找到對話內容的展開清單 (Pre Choice Segments 或對話段落)。
  • 在畫面右側 Inspector 的特定劇情段落中,直接於新增的 Unlock Achievement ID 欄位填入對應的成就代碼ITEM_CAPYBARA(如圖一所示),實現所見即所得的無縫觸發。
    https://ithelp.ithome.com.tw/upload/images/20261001/20184073eyTdX9bRWH.png
    圖三、以第12幕為例,填入對應的成就代碼ITEM_CAPYBARA

五、開發實戰經驗:踩坑與架構反思

  • Pitfall 1:彈窗頻繁觸發的覆蓋問題:
    • 狀況:如果玩家短時間內連續解鎖多個成就,彈窗動畫或計時器會打架,導致畫面上的文字錯亂或提早關閉。
    • 解法:在 ShowPopup 中加入 StopAllCoroutines(),確保每次呼叫都能重新計算顯示時間並更新當前資訊。
  • Pitfall 2:字體顯示問題:
    • 狀況:實際操作將成就輸入文本後,中文無法顯示,皆變成◻◻亂碼。
    • 解法:先將需要用的字體載下來拖入AchievementPopup Prefab的DescText以及NameText(根據文本需要下載中文字,全部中文字下載檔案會太大)
      https://ithelp.ithome.com.tw/upload/images/20261001/20184073Y6Se8WZXcb.png
      圖四、根據所需下載的中文字體掛進DescText及NameText

六、今日成果與小結

  • 即時通知機制: 成功實現成就解鎖時的彈窗提示與自動關閉。
  • 觸發與回饋整合: 遊戲內道具與事件可以流暢地與成就系統連動,完成成就系統的最後一塊拼圖!
    https://ithelp.ithome.com.tw/upload/images/20261001/20184073KmTcQxDzhP.png
    圖五、第9幕成就彈出

https://ithelp.ithome.com.tw/upload/images/20261001/201840738cDiGt0XBT.png
圖六、成就解完DAY24所做的成就列表皆會顯現

範例影片:Yes

今天的內容主要是實作「成就彈窗通知(AchievementPopup)」與「對話系統成就觸發串接(整合進 StoryFlowManager 與 DialogueSegment)」,讓遊戲內事件能夠即時回饋並解鎖成就。因為它依然是成就系統功能擴充的一環,所以它同樣屬於feature/achievement-system:

1.檢查目前修改狀態
git status

2.加入暫存區並提交 Commit:
git add .
git commit -m "feat: 實作 AchievementPopup 彈窗通知與對話系統成就觸發整合,完成成就系統即時回饋與互動"

4.將分支推送到遠端倉庫:
git push origin feature/achievement-system


上一篇
【DAY24】Unity 2D 敘事遊戲開發:主選單成就清單與灰階視覺化(Achievement System Part 2 - Main Menu UI & GrayScale)
系列文
從課堂半成品到完整發布:獨立遊戲的30天重生記 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言