這篇在講什麼

《Endless End》裡需要一套能讓玩家上下移動的梯子系統。這篇在整理我當時怎麼拆需求、試過哪些方案,以及最後為什麼改成 trigger-based 的版本。

我希望梯子有什麼手感

我先把需求拆成幾件事:

  1. 玩家靠近梯子頂端或底端時,可以開始攀爬
  2. 玩家進入梯子中段後,只允許上下移動,不允許左右亂飄
  3. 玩家在頂端和底端的過渡區,仍然要保留合理的水平控制
  4. 玩家開始攀爬時,角色的 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 分清楚,控制邏輯會穩很多