iT邦幫忙

2026 iThome 鐵人賽

DAY 12
0
Software Development

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

Day 12:建立村莊不可通行區域

  • 分享至 

  • xImage
  •  

前一天我已經完成攝影機跟隨玩家的功能,讓玩家在 VillageScene 中移動時,畫面可以跟著角色移動。玩家能移動、攝影機也能跟隨後,接下來就需要處理另一個很重要的問題:地圖中的物件必須具備碰撞,否則玩家可以直接穿過房子、木牆、樹木或其他裝飾物。

因此 Day 12 的目標,是建立村莊中的不可通行區域。這一天先不處理三個出口的場景切換,也不做任務或 NPC 對話,而是專注在讓玩家不能穿過主要障礙物。

一開始我先檢查玩家本身的碰撞設定。因為這是一款 2D 俯視角 RPG,玩家不應該用整個角色圖片作為碰撞範圍。角色圖片是 64×64,如果整個身體都被 Collider 包住,走路時很容易因為頭部或身體碰到物件而卡住。
所以我先確認 Player 的 BoxCollider2D 只包住腳底附近。

https://ithelp.ithome.com.tw/upload/images/20260910/20178373eIQblxrA8W.png

玩家的碰撞範圍只放在腳底,是為了讓角色移動時更自然。實際遊戲中,玩家通常是「腳的位置」代表站在哪裡,而不是整張角色圖都代表實際碰撞範圍。這樣角色可以靠近房屋或樹木,但不會因為上半身碰到圖像邊緣就被擋住。

接著我先替主要房屋加入碰撞測試。第一個處理的是 PlayerHouse。這棟房子是主角的家,也是村莊中重要的功能建築,所以它必須能阻擋玩家,不能讓玩家直接走進房屋底部或穿過牆面。

https://ithelp.ithome.com.tw/upload/images/20260910/201783730QNm6J2oqR.png

在設定房屋碰撞時,我沒有把整個屋頂都包進 Collider,而是只讓碰撞範圍覆蓋房屋下方比較合理的阻擋區域。這樣玩家看起來可以靠近房屋前方,但不會直接走進建築內部。

由於場景中的物件越來越多,如果每個房子、木牆、樹叢、石頭和告示牌都手動加碰撞,工作量會非常大,而且也容易漏掉。更麻煩的是,Day 8 建村莊時,場景中有些物件名稱還不夠清楚,甚至有些物件被錯誤命名。

例如原本場景裡有一批物件叫做 PebblePath_01 到 PebblePath_15,看起來像是小石子路,但實際檢查後發現它們其實是小樹。如果按照名稱判斷,這些物件會被當成可走的道路細節,結果玩家就能走到小樹上面。這種問題如果不先整理命名,後面加 Collider 就會一直漏。

因此我決定建立一個 Unity Editor 工具,讓它先整理村莊物件的命名與分組,再批次加入碰撞箱。這個工具命名為 VillageSceneOrganizer.cs。

https://ithelp.ithome.com.tw/upload/images/20260910/20178373I8tNVsuC2Z.png
https://ithelp.ithome.com.tw/upload/images/20260910/20178373hVAP6fSpjk.png

VillageSceneOrganizer 的主流程不是單純加 Collider,而是先做完整整理。它會先修正錯誤命名,接著建立村莊用的分組物件,例如 VillageBuildings、VillageBoundary、VillageObstacleDecorations、VillagePathDetails 和 VillageDevOnly。最後再根據物件分類批次加入 BoxCollider2D。

這樣做的好處是,場景不只獲得碰撞功能,Hierarchy 也會變得更清楚。之後如果要找房屋、木牆、樹木或開發測試物件,就不用在一堆素材預設名稱中慢慢翻。

接著,工具中也加入了錯誤命名修正。這一步是 Day 12 很重要的部分,因為前面漏加 Collider 的根本原因,就是有些物件名稱和實際內容不一致。

https://ithelp.ithome.com.tw/upload/images/20260910/20178373uH4wbgxkY5.png

在修正命名時,工具會把 PebblePath_01 到 PebblePath_15 改成 SmallTree_01 到 SmallTree_15。這樣它們就不再被當成路面細節,而會被視為需要阻擋玩家的小樹障礙物。

另外,工具也修正了其他不清楚的名稱,例如將 VillageHouse_NorthWestMarker 改成更合適的村莊裝飾名稱,並將測試用物件改成 Dev_Unused_TestFloorSprite,避免它和正式場景物件混在一起。
命名修正之後,工具才進入批次整理與加 Collider 的部分。

https://ithelp.ithome.com.tw/upload/images/20260910/20178373LFwhBXCO6o.png
https://ithelp.ithome.com.tw/upload/images/20260910/20178373zXdoejcBB2.png

這段程式會依照物件名稱的 prefix,把物件搬到對應群組底下。例如房屋會整理到 VillageBuildings,木牆會整理到 VillageBoundary,樹木、石頭和告示牌則會整理到 VillageObstacleDecorations。小石子路或可行走的地面細節則保留在可通行類別,不加 Collider。

在加 Collider 時,工具也會先檢查物件是否已經有 BoxCollider2D。如果已經存在,就不會重複新增。這樣可以避免同一個物件被加上多個碰撞箱,造成後續調整困難。
完成程式碼後,我在 Unity 上方選單中執行工具:
IronRPG > Day 12 > Organize Village Objects And Colliders

https://ithelp.ithome.com.tw/upload/images/20260910/20178373CxYbjx7B4a.png

執行後,工具會自動整理村莊場景內的物件,修正命名、建立分組,並替主要障礙物加入 BoxCollider2D。這比手動一個一個物件設定快很多,也比較不容易漏掉。

這裡也遇到過一次教訓:一開始曾嘗試直接修改 .unity 場景檔,但 Unity 的場景 YAML 對元件引用很敏感,容易造成 fileID 錯誤。後來改成使用 Unity Editor 工具,讓 Unity 自己建立元件,就安全得多。這也讓我理解到,處理 Unity 場景物件時,與其直接改場景檔,不如透過 Editor API 操作,避免把場景結構弄壞。

執行完成後,我檢查了場景中的碰撞箱總覽。房屋、木牆、小樹、樹叢、石頭與告示牌都已經有碰撞箱,而道路、小石子路和草地仍然保持可通行。

https://ithelp.ithome.com.tw/upload/images/20260910/20178373GqRZIiinK6.png

從 Scene 視窗可以看到,村莊中的主要障礙物已經出現綠色 Collider 框。這代表玩家不再能隨意穿過房屋、木牆或樹木,也不會直接走到石頭與告示牌上面。

最後我進入 Play 模式進行測試。測試重點包括:玩家不能穿過房子、不能穿過北側木牆、不能走到小樹上,也不能穿過石頭和告示牌。同時,玩家仍然可以正常走在道路、草地與可通行的地面細節上。

這一步測試成功,但我沒有另外截圖,因為前面的程式碼、工具執行與碰撞箱總覽已經足夠說明 Day 12 的成果。
透過 Day 12 的整理,VillageScene 的地圖已經不再只是可以看的場景,而是開始具備遊戲中的空間規則。玩家能移動,但不能穿過主要障礙物;可通行與不可通行的區域也開始變得清楚。

下一步 Day 13 可以開始處理場景出口與轉場準備。因為前面已經設定過教學遺跡有三個出口,之後需要整理從教學區通往村莊、森林或洞窟的場景連接方式。不過在正式寫場景切換之前,Day 12 先把村莊內部的基本碰撞整理好,是比較穩定的做法。


上一篇
Day 11:讓攝影機跟隨玩家移動
系列文
Unity進階——做一個完整的遊戲12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言