這篇在講什麼
《Endless End》裡需要一套能讓玩家上下移動的梯子系統。這篇在整理我當時怎麼拆需求、試過哪些方案,以及最後為什麼改成 trigger-based 的版本。
我希望梯子有什麼手感
我先把需求拆成幾件事:
- 玩家靠近梯子頂端或底端時,可以開始攀爬
- 玩家進入梯子中段後,只允許上下移動,不允許左右亂飄
- 玩家在頂端和底端的過渡區,仍然要保留合理的水平控制
- 玩家開始攀爬時,角色的
x位置要和梯子對齊,避免視覺上漂移
這種互動的難點,不是「能不能往上爬」,而是頂端、底端切換時會不會卡手。

最後我把梯子的可互動區域拆成三段:
- Top
- Middle
- Bottom

我先試的是 Raycast 版本
第一版做法很直接:讓玩家往上、往下各打一條 raycast,檢查是否命中梯子 layer,再根據命中位置判斷目前在梯子的哪個區域。

玩家控制端大致會這樣判斷:
- 上方或下方 raycast 命中梯子時,設為可攀爬
- 在梯子中段時,禁用水平移動並把重力清掉
- 在頂端或底端時,保留部分水平控制,並看垂直輸入是否要正式進入攀爬

Raycast 版的主要問題
真正麻煩的是過渡區。
當玩家從中段往上移到頂端,或從中段往下移到地面時,raycast 經常會比角色真正的身體位置更早或更晚切換判定,結果就會出現:
- 明明還沒完全到頂,卻已經被視為可以自由水平移動
- 明明已經快離開梯子,卻還被判在中段


這不是 raycast 做不到,而是它要靠很多 offset、距離和角色尺寸去微調。對這個案子來說,維護成本偏高。
後來我改成 Trigger 版本
最後我選擇的做法,是把梯子本身拆成三個 trigger:
- Top trigger
- Middle trigger
- Bottom trigger

梯子的物件結構大致長這樣:

而玩家腳底的 trigger 只要進出這些區塊,就能更新自己目前所在的梯子區段。


Trigger 版本怎麼控制角色
角色控制端只需要根據目前所在區段來切行為:
在 Middle
- 禁止水平移動
- 重力設為 0
- 把角色
x對齊梯子 - 根據垂直輸入上下攀爬
在 Top / Bottom
- 允許水平移動
- 只有在垂直輸入不為 0 時才正式切進攀爬狀態
- 保留比較自然的進出梯子手感


為什麼最後選 Trigger 版本
兩個版本都能做出可以玩的梯子,但 trigger 版更適合這個專案,原因很實際:
- 區域語意更清楚,Top / Middle / Bottom 一眼可讀
- 不需要一直微調 raycast 長度和 offset
- 問題更容易轉成 collider 佈局問題,除錯比較直觀
- 頂端與底端的切換手感更穩
代價則是:
- 物件結構稍微複雜一點
- 每支梯子都要配置好三段 trigger
但這個代價是值得的。
我自己的整理
這篇最大的收穫不是「梯子該用 raycast 還是 trigger」,而是要先把互動分區說清楚。
只要互動過渡區很多,先把行為切成明確區塊,後面的控制程式通常會簡單很多。
先記住的重點
- 梯子系統最難的是區段過渡,不是單純上下移動
- raycast 版可行,但容易卡在大量細節微調
- trigger 版更適合區塊語意清楚的互動設計
- 先把 Top / Middle / Bottom 分清楚,控制邏輯會穩很多