iT邦幫忙

2026 iThome 鐵人賽

DAY 14
0
Software Development

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

Day 14:建立第一條場景轉場路線

  • 分享至 

  • xImage
  •  

前一天我整理了遊戲的場景流程,確認 TutorialScene 是早期世界的分岔點,可以通往村莊、森林與洞窟,而 VillageScene 目前只會回到教學遺跡。Day 13 主要是在做規劃與轉場資料結構,還沒有真正讓玩家從一個場景切換到另一個場景。

因此 Day 14 的目標,就是建立第一條真正可用的場景轉場路線。這一天先不處理森林和洞窟,也不做完整的大型轉場系統,而是先把最重要的一條路接起來:
TutorialScene → VillageScene
也就是讓玩家可以從教學遺跡走到村莊。

首先,我先確認 TutorialScene 和 VillageScene 是否已經加入 Unity 的 Build Profile 場景清單。因為 Unity 的 SceneManager.LoadScene() 只能載入已經加入 Build Profile 或場景清單的 Scene,如果沒有加入,程式即使寫對也會載入失敗。

https://ithelp.ithome.com.tw/upload/images/20260912/201783732CCBoX2Fqt.png

一開始測試時,我就遇到了場景無法載入的錯誤。錯誤訊息指出 VillageScene 沒有加入 active build profile 或 shared scene list。這代表問題不在轉場腳本,而是在 Unity 的建置場景清單沒有正確設定。
因此我打開 Build Profiles,將 TutorialScene 和 VillageScene 都加入場景列表,並確認兩個場景都有勾選。這一步是場景轉場能運作的前提。

接著,我將 Day 13 建立的 SceneTransitionPoint.cs 從單純的資料標記,擴充成可以實際觸發場景切換的腳本。

https://ithelp.ithome.com.tw/upload/images/20260912/20178373Ykp6mqqVFr.png
https://ithelp.ithome.com.tw/upload/images/20260912/20178373t8JKU7qPyp.png

這次的 SceneTransitionPoint 會在玩家進入 Trigger 時讀取 targetSceneName,並透過 SceneManager.LoadScene(targetSceneName) 載入目標場景。同時,它也會記錄 targetSpawnPointName,讓新場景載入完成後,可以把玩家移動到指定的出生點。

這樣 Day 13 的欄位就不只是文字紀錄,而是開始成為轉場系統的一部分。targetSceneName 負責決定要去哪個場景,targetSpawnPointName 則負責決定進入新場景後玩家出現在哪裡。

接著我在 TutorialScene 裡設定通往村莊的出口。原本我先把 SceneTransitionPoint 掛在 Exit_ToVillage 上,但後來發現這個點位其實比較像「通往村莊方向的提示點」,不是玩家真正踩到後應該進村的終點。

https://ithelp.ithome.com.tw/upload/images/20260912/20178373uMHVfGwyKd.png

這張圖記錄了最初將 SceneTransitionPoint 掛到出口點上的設定。欄位中,Target Scene Name 填入 VillageScene,Target Spawn Point Name 填入 Entry_FromTutorialRuins,並加上 Box Collider 2D 且勾選 Is Trigger。

不過後來檢查場景動線後,我發現真正適合作為進村出口的位置應該是原本的 TutorialEndPoint。因此我修正了 Marker 的用途:把原本偏向方向提示的點改名為 Direction_ToVillage,而將 TutorialEndPoint 改成真正的 Exit_ToVillage。

https://ithelp.ithome.com.tw/upload/images/20260912/20178373w0RTOlz9EJ.png

修正後,新的 Exit_ToVillage 才是玩家真正走到後會觸發轉場的位置。這一步很重要,因為場景轉場不只要腳本正確,點位也要符合地圖動線。如果把轉場 Trigger 放在提示點或不合理的位置,玩家可能會在還沒走到出口前就被送走,或者根本踩不到正確位置。

完成點位修正後,我再次確認 Build Profile 中的場景列表。這時 TutorialScene 和 VillageScene 都已經被加入清單中。

https://ithelp.ithome.com.tw/upload/images/20260912/20178373jFysWci6rO.png

這一步解決了前面 VillageScene 無法載入的問題。完成後,SceneManager.LoadScene("VillageScene") 才能正常運作。

接著開始測試時,又遇到另一個問題:TutorialScene 中原本顯示的角色並不是我 Day 9 建立的正式 Player,而是 Cainos Demo 原本留下來的測試角色。這個角色外觀和村莊中的 Player 不一致,而且攝影機也可能還綁著舊的測試物件。

因此我決定把 TutorialScene 也改成使用正式的 Player.prefab,讓教學遺跡和村莊都使用同一個玩家物件、移動腳本與鏡頭邏輯。

不過正式 Player 拖進 TutorialScene 後,馬上出現新的問題:玩家被背景或場景圖層遮住了。

https://ithelp.ithome.com.tw/upload/images/20260912/20178373QHIRJXDH5u.png

一開始我以為 Player 的 Order in Layer = 20 應該足夠讓角色顯示在場景上方,但實際上還是被 Cainos 場景中的物件壓住。後來確認原因是 Sorting Layer 不同。

Unity 的 2D 顯示排序不是只看 Order in Layer,而是先看 Sorting Layer,再看同一個 Sorting Layer 裡的 Order in Layer。Cainos Demo 場景使用了 Layer 1、Layer 2、Layer 3 這類 Sorting Layer,而正式 Player 原本還在 Default,所以即使 Order 數值較高,也可能被其他 Sorting Layer 的物件蓋住。
修正方式是將 Player 的 Sorting Layer 改成 Layer 3,並保留 Order in Layer = 20。

https://ithelp.ithome.com.tw/upload/images/20260912/20178373cCbiCthHVF.png

修正後,Player 就能正常顯示在 TutorialScene 中,不再被背景或 Tilemap 壓住。這一步也提醒我,當專案混用不同素材包時,不能只看單一物件的 Order 數值,還要注意整個場景使用的 Sorting Layer 系統。

接著我也確認了攝影機跟隨問題。原本 TutorialScene 中的 Main Camera 使用的是 Cainos Demo 自帶的攝影機邏輯,可能還綁著舊角色。為了讓教學場景和村莊場景一致,我改成使用自己 Day 11 建立的 CameraFollow 邏輯,讓攝影機追蹤正式 Player。

https://ithelp.ithome.com.tw/upload/images/20260912/201783732D7cEMgfj0.png

修正後,正式 Player 在 TutorialScene 中可以移動,攝影機也能正常跟隨。這讓教學場景不再依賴 Cainos Demo 原本的測試角色和攝影機系統,而是逐步接上自己專案的玩家控制流程。

接下來進行轉場測試時,又遇到一個場景通行問題。原本教學遺跡裡有幾個樓梯和拱門,看起來應該可以通過,但玩家實際走過去時會被擋住。

一開始我檢查了樓梯物件本身,發現根物件 Inspector 裡沒有 Collider。這表示阻擋玩家的不一定是樓梯本身,而可能是底下的 Tilemap Collider 或 prefab 子物件裡的隱藏 Collider。

https://ithelp.ithome.com.tw/upload/images/20260912/20178373U4lhQwQd5E.png

檢查後發現,Cainos 場景中有多層 Wall Tilemap,例如 Layer 1 - Wall、Layer 2 - Wall 和 Layer 3 - Wall,它們都可能包含 Tilemap Collider 2D 或 Composite Collider 2D。有些樓梯和拱門看起來是可通行物件,但底下其實還有牆壁 Tilemap 的碰撞格子擋住玩家。

因此我使用 Tile Palette 的橡皮擦工具,針對玩家應該通過的樓梯和拱門中間路線,清除底下 Wall Tilemap 的碰撞格子。

https://ithelp.ithome.com.tw/upload/images/20260912/20178373OJHdwKDP9J.png

這一步不是刪除樓梯或拱門本身,而是清掉藏在下面、原本用來阻擋玩家的牆壁 Tile。修正後,多數樓梯和拱門都可以正常通過。

不過其中一個樓梯仍然無法通行。即使我清除了 Wall Tilemap,並檢查了幾層牆壁碰撞,玩家還是被擋住。後來進一步檢查後,才發現問題不是 Tilemap,而是樓梯 prefab 子物件中還藏著一個 Collider。

具體來說,問題出在:
PF Struct - Stairs E 02
底下的 Collider Upper
其中的 Polygon Collider 2D

https://ithelp.ithome.com.tw/upload/images/20260912/20178373aVHrhpOXab.png

這個 Collider 沒有掛在樓梯根物件上,所以如果只選取 PF Struct - Stairs E 02 本身,Inspector 裡看不到它。必須展開 prefab 子物件,找到 Collider Upper,才能看到那個還在阻擋玩家的 Polygon Collider 2D。

取消這個殘留 Collider 後,玩家終於可以正常通過該樓梯。這也是 Day 14 裡很重要的一個除錯經驗:有時候玩家被擋住,不一定是眼前那個物件本身,而可能是 Tilemap、Composite Collider,或 prefab 子物件裡藏著的碰撞器。

最後,我重新測試整個教學場景。測試結果是:正式 Player 可以在 TutorialScene 中自由走動,攝影機可以跟隨,樓梯和拱門也能正常通過,並且可以從 Exit_ToVillage 成功轉場到 VillageScene。

https://ithelp.ithome.com.tw/upload/images/20260912/20178373wLKgZdcg0F.png

由於我沒有錄製影片,所以沒有製作轉場瞬間的截圖。轉場成功這一點以文字紀錄即可:目前已確認玩家可以從 TutorialScene 走到村莊出口,觸發轉場後進入 VillageScene,並出現在 Entry_FromTutorialRuins 附近。

透過 Day 14 的製作,遊戲從「場景流程規劃」正式進入「場景可以互通」的階段。這一天完成了第一條可用的場景轉場路線,也修正了多個混用素材包時常見的問題,包括 Build Profile 場景清單、出口 Marker 使用錯誤、正式 Player 替換、Sorting Layer、CameraFollow 目標,以及 Cainos prefab 子物件中隱藏 Collider。

下一步就可以在這條基礎路線上,繼續加入 NPC、任務流程,或開始規劃森林與洞窟場景。至少現在,玩家已經不只是能在單一村莊中移動,而是可以真正從教學遺跡走向主村莊。


上一篇
Day 13:整理場景出口與轉場前置標記
系列文
Unity進階——做一個完整的遊戲14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言