iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
Software Development

Unity進階——做一個完整的遊戲系列 第 19

Day 19:放置村長 NPC 與建立第一段互動對話

  • 分享至 

  • xImage
  •  

前一天我完成了村長家的室內場景,也就是 ChiefHouseInteriorScene。目前玩家已經可以從村莊進入村長家,也可以從村長家回到村莊。既然村長家已經能進入,下一步自然就是把村長放進去,讓這個場景不再只是空房間。
因此 Day 19 的目標,是在村長家室內放置村長 NPC,並建立第一段最基本的互動對話。這一天先不做完整任務系統,也不做正式對話 UI,只先完成最小可用流程:玩家靠近村長時看到提示,按下互動鍵後顯示對話文字。

一開始,我先確認要使用哪個 NPC 素材。原本曾經暫時使用玩家角色的基礎圖像作為村長 placeholder,但這樣不合理,因為村長應該和玩家外觀不同。

重新檢查 Anokolisa 匯入的素材後,我發現其實已經有正式 NPC 資料夾,裡面包含 Citizen_F、Knight、Rogue、Wizzard 等角色。村長需要看起來比較像能給任務的人,因此這次選擇使用 Wizzard 的待機圖像作為村長外觀。

https://ithelp.ithome.com.tw/upload/images/20260917/20178373wt8XpY5De0.png

村長使用的素材位置是:
Assets/ImportedAssets/Anokolisa_TopdownRPG/NPCs/Wizzard/Idle/Idle-Sheet.png
我選擇其中的 Idle-Sheet_0 作為村長的基本站立圖像。這樣村長會和玩家角色明顯區分,也比較符合「村中長者」或「任務引導者」的定位。

接著,我在 ChiefHouseInteriorScene 中放置村長 NPC,命名為 ChiefNPC,並將剛剛選好的 Wizzard Idle Sprite 指定給它。

https://ithelp.ithome.com.tw/upload/images/20260917/20178373oS1UCCZBin.png

ChiefNPC 被放在村長家室內適合對話的位置。這裡不是隨便把 NPC 丟進場景,而是要考慮玩家進入村長家後,能不能自然走到村長附近並觸發互動。

為了讓村長本身不會被玩家穿過,我也替 ChiefNPC 加上 BoxCollider2D。最後保留的碰撞設定比較貼近目前場景比例,ChiefNPC 的位置為 X 3.2、Y -23.9、Z 0,縮放為 X 10、Y 10、Z 1,身體碰撞箱大小為 X 0.4、Y 0.5。這些數值不是一開始就剛好,而是依照場景比例調整後的結果。

放好村長後,下一步是建立玩家和村長之間的互動範圍。我沒有直接讓玩家碰到村長本體就觸發對話,而是在 ChiefNPC 底下建立子物件 ChiefInteractionArea,專門作為互動範圍。

https://ithelp.ithome.com.tw/upload/images/20260917/20178373DCv8Sr4Qql.png

ChiefInteractionArea 使用 BoxCollider2D,並勾選 Is Trigger。這代表玩家進入這個範圍時,不會被擋住,而是觸發互動判定。

最後保留的互動範圍位置是本地座標 X 0、Y -0.1、Z 0,碰撞箱大小為 X 1、Y 0.9。這個範圍比 NPC 本體稍微大一點,讓玩家不需要精準貼在村長身上才能對話。

接著,我建立互動腳本 NpcDialogueInteraction.cs。這個腳本是 Day 19 的核心,負責判斷玩家是否進入互動範圍,以及玩家按下按鍵時要開啟、推進或關閉對話。

https://ithelp.ithome.com.tw/upload/images/20260917/20178373o4rcIBPGU2.png

這張程式碼截圖主要放 Update() 的部分。

在這段邏輯中,腳本會先確認玩家是否在互動範圍內。如果玩家不在範圍內,就不處理互動按鍵,避免玩家在地圖任何地方都能和村長隔空對話。

當玩家在互動範圍內時,按下 E 或 Space 可以開啟對話。如果對話已經開啟,再按一次 E 或 Space 就會推進到下一句。按下 Esc 則可以關閉對話。

這樣就形成了一個最基本的互動流程:靠近 NPC、按鍵對話、推進文字、關閉對話。
目前對話顯示方式使用的是 OnGUI,這只是 Day 19 的暫用做法。正式 UI 之後可以再改成 Canvas 對話框,但在這一天先用最小方式確認互動流程能跑通。

完成腳本後,我回到 Unity,將 NpcDialogueInteraction 掛到 ChiefInteractionArea 上。

https://ithelp.ithome.com.tw/upload/images/20260917/20178373lduzquKeba.png

這裡的設計是:ChiefNPC 本體負責顯示村長外觀和碰撞,而 ChiefInteractionArea 負責偵測玩家是否靠近並觸發對話。這樣分開做的好處是,如果之後想調整互動範圍,只需要調整 ChiefInteractionArea 的大小和位置,不會影響 NPC 本體碰撞。

在 Inspector 中可以看到,ChiefInteractionArea 上有 BoxCollider2D,而且 Is Trigger 已勾選,同時也掛上了 NpcDialogueInteraction。這代表這個物件已經具備互動判定功能。
最後,我進入 Play Mode 測試村長對話。測試流程是:玩家進入村長家後靠近 ChiefNPC,畫面出現互動提示,接著按下 E 或 Space 觸發對話。

https://ithelp.ithome.com.tw/upload/images/20260917/20178373V3jrKSKyMV.png

測試結果成功。玩家靠近村長時,畫面會出現「按 E 與村長交談」的提示。按下 E 後,畫面下方會顯示村長的對話內容;再次按下 E 或 Space 可以推進下一句,按 Esc 則可以關閉對話。

這代表幾個功能已經串接成功:
ChiefInteractionArea 可以偵測玩家進入互動範圍。
NpcDialogueInteraction 可以讀取互動按鍵。
對話可以開啟、推進和關閉。
村長家室內已經有第一個可互動 NPC。

Day 19 完成後,村長家不再只是可以進入的空場景,而是開始具備劇情功能。玩家現在可以走進村長家,靠近村長,並觸發第一段對話。雖然目前還沒有正式任務系統,也還沒有精美對話 UI,但這一步已經讓主線劇情有了起點。

下一步 Day 20 可以接著整理第一段主線任務目標。也就是讓村長在對話中告訴玩家:森林遺跡附近出現異常,需要前往森林入口調查。


上一篇
Day 18:建立村長家室內場景與雙向轉場
下一篇
Day 20:建立森林場景原型與主線探索路線
系列文
Unity進階——做一個完整的遊戲25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言