遊戲裡的樓梯為什麼有的可以走有的不行

發表時間:2026 年 11 月 02 日 | 更新日期:2026 年 11 月 02 日 | 編輯:雅寶社區編輯團隊
遊戲裡的樓梯為什麼有的可以走有的不行 - 雅寶社區 · 頂客論壇

這也是為什麼老遊戲的樓梯走起來總有一種「滑上去」的錯覺,而且角色模型會微微浮在階梯上方——因為角色的腳實際踩在斜坡上,而不是踏面上。

二、角色控制器的兩道門檻:坡度極限與台階高度

現代遊戲大多採用「膠囊體 + 掃掠檢測」的角色控制器(Character Controller)。它不像真實物理物件那樣被重力與碰撞推來推去,而是由程式主動決定「這一步能不能移動過去」。而在這個判斷過程中,有兩個參數決定了樓梯的生死。

2-1 斜坡極限角(Slope Limit):太陡就是牆

角色控制器通常會設定一個「可站立坡度上限」,常見數值是 45 度或 46 度。當角色前方偵測到的表面傾斜角超過這個值,系統就會把它視為「牆壁」而不是「地板」,角色不會沿著它往上滑,而是直接被擋住、甚至往下滑落。

這個設計的用意是防止玩家爬上不該爬的地方,例如峭壁、屋頂斜面。但問題來了:如果樓梯的碰撞體是斜坡,而那個斜坡的角度超過了 Slope Limit,樓梯就會瞬間變成峭壁。

這種事情比你想的更常見。原因包括:

美術人員做的樓梯視覺角度偏陡(例如 50 度),碰撞人員照著拉斜坡,結果直接超過極限。

樓梯的碰撞斜坡為了「包住」階梯的凸出邊緣,起點與終點被往外拉,實際角度比視覺上更陡。

  • 不同角色的 Slope Limit 不一致:人類角色 45 度、載具 30 度、穿重甲的角色 35 度。結果就是「隊友走得上去,你走不上去」。
  • 狀態切換時參數被改動:例如《上古卷軸 5》裡衝刺、潛行、負重過高時,部分移動參數會變化,導致某些樓梯在特定狀態下變得無法通行。
  • 實務上還有一個經典陷阱:斜坡的「法線」計算。如果碰撞體由多個小三角形拼成,而某個三角形的法線因為頂點焊接不良或縮放不均而歪掉,那個區域算出來的角度就會異常,於是出現「樓梯一半能走、一半卡住」的詭異現象。

    2-2 台階高度(Step Offset / Max Step Height):差一公分也不行

    當樓梯的碰撞體是「一階一階的方塊」時,決定你能不能上去的就是「最大台階高度」。角色控制器在水平移動被阻擋時,會往上做一次探測:如果阻擋物的高度低於這個值,就把角色往上抬,讓他「跨」過去;如果高於這個值,就判定為牆。

    常見設定值大概是 0.3 公尺到 0.5 公尺(Unity 的 CharacterController 預設 stepOffset 是 0.3,Unreal 的 CharacterMovement 預設 Max Step Height 是 45 單位,約 45 公分)。而樓梯的每一階高度,通常落在 15 到 20 公分——理論上完全沒問題。

    那為什麼還是會卡?幾個常見原因:

  • 階高不統一:美術建模時為了「看起來順」,把某一階做得特別高,或者因為樓梯總高度除以階數除不盡,最後一階變成 40 公分。那一階就變成了一道牆。
  • 階梯邊緣有裝飾物:樓梯口有一塊門檻、一條地毯、一個防滑銅條。這些小物件如果被賦予了碰撞體,實際台階高度就被默默加高了。
  • 碰撞體沒有對齊視覺:碰撞方塊整體往上偏移了幾公分,導致每一步的有效階高都超過上限。
  • 角色膠囊體的底部形狀:膠囊體底部是圓弧,當它靠近階梯邊緣時,接觸點會比你想像的更低,等效台階高度變大。
  • 移動速度太快:高速移動時,單帧位移可能直接跨過偵測範圍,台階偵測來不及觸發,角色就撞上去了。
  • 2-3 膠囊體半徑與「狹窄樓梯」的隱形問題

    還有一個常被忽略的因素:角色的碰撞體不是一個點,而是一個有半徑的膠囊。當樓梯兩側有牆壁或扶手碰撞體時,如果樓梯淨寬小於「膠囊直徑 + 一點餘裕」,角色就會被兩側同時推擠,導致移動速度歸零或不斷抖動。

    你會看到角色在樓梯上「原地顫抖」、「螺旋上升」、「被卡在第三階上不去也下不來」。這不是樓梯不能走,而是走得進去、卡在中間。這種情況在窄樓梯、旋轉梯、以及有華麗扶手的場景裡特別容易出現。

    三、物理引擎與碰撞偵測:看起來踩到了,為什麼還是掉下去

    即使樓梯的碰撞體設定完全正確,角色仍然可能在某些情況下「穿過」樓梯。這通常跟碰撞偵測的精度與方式有關。

    3-1 連續碰撞偵測與高速穿模

    多數物理引擎預設使用「離散碰撞偵測」:每一帧檢查物件是否重疊。如果角色移動速度很快,一帧內位移超過了碰撞體厚度,就可能從樓梯的一端直接跳到另一端,中間完全沒被偵測到——這就是俗稱的「穿模」或「隧穿效應」。

    在樓梯上的典型症狀是:角色高速衝下樓梯時突然掉出地圖、或者從樓梯底部往上跳時直接穿過整座樓梯。解決方式通常是啟用連續碰撞偵測(CCD),但這會增加效能开销,所以很多遊戲只在特定物件或高速狀態下啟用。

    反過來說,有些遊戲為了防止玩家利用穿模跳關,會刻意把樓梯的碰撞體做厚,或者在樓梯下方加一層「保險地板」。這也解釋了為什麼有些樓梯「踩起來特別高」——你的腳其實踩在隱形的保險層上。

    3-2 三角網格、凸包與方塊的差異

    碰撞體的幾何種類,對樓梯通行性影響極大:

    碰撞體類型

    優點

    對樓梯的影響

    方塊(Box)

    運算最快、最穩定

    階梯邊緣是銳角,容易卡住;需要精準對齊

    凸包(Convex Hull)

    貼合度較好、效能可接受

    適合做整座樓梯的包圍體,但內部細節會消失

    三角網格(Mesh Collider)

    最精確

    效能開銷大;薄面容易發生穿模;法線錯誤會導致坡度判定異常

    斜坡(平面)

    最省、移動最順

    視覺與碰撞不一致;坡度超過上限就會變成牆

    很多「不能走的樓梯」其實是三角網格碰撞體出了問題:面太薄、頂點沒有焊接、法線翻轉、或者模型縮放不是 1:1 導致法線重新計算後歪掉。這些問題在畫面上完全看不出來,只有角色走過去才會發現。

    3-3 浮點精度與樓梯邊緣的抖動

    當玩家角色站在樓梯邊緣、或者樓梯位於地圖中距離原點非常遠的位置時,浮點數精度不足會導致碰撞判定抖動。症狀包括:角色在階梯邊緣不斷上下彈跳、站不穩、被慢慢推離樓梯、甚至直接掉下去。

    這也是為什麼有些遊戲會把世界切成多個區塊(World Partition / Streaming Cell),並在玩家附近使用局部座標系——不是為了載入速度,而是為了避免遠離原點時的精度災難。

    四、AI 與導航網格:NPC 走的樓梯,跟你走的不是同一座

    這是一個非常容易被忽略的層面。玩家角色靠角色控制器移動,但 NPC 與敵人通常靠導航網格(NavMesh)移動。兩者的判定邏輯完全不同,因此會出現「玩家上不去、NPC 卻悠哉走上來」或者「玩家走得上去、隊友卻卡在樓梯口」的荒謬場面。

    4-1 NavMesh 烘焙與坡度、台階參數

    NavMesh 是透過「烘焙」產生的:工具會掃描場景中的可行走表面,根據一組參數(最大坡度、最大台階高度、代理半徑、代理高度)生成一張多邊形網格。AI 只會在這張網格上移動。

    關鍵在於:NavMesh 的烘焙參數跟玩家角色控制器的參數是兩套獨立設定。如果美術把樓梯做得稍微陡一點,玩家端可能還勉強能走(因為角色控制器有額外的台階補償),但 NavMesh 烘焙時直接判定「這裡太陡,不可行走」,於是 AI 完全不會走這座樓梯。

    反過來也成立:NavMesh 的台階高度設定得比玩家寬鬆,AI 就能走上一座玩家爬不上去的樓梯。於是玩家看著敵人沿著牆壁「飄」上樓,心裡只剩下問號。

    4-2 把樓梯當成斜坡:Off-Mesh Link 與跳躍點

    對於那種「碰撞上根本不能走」的樓梯(例如太陡的旋轉梯、或是根本只是裝飾的階梯),開發者有時會額外放置Off-Mesh Link(脫網連結),明確告訴 AI:「從 A 點到 B 點,直接播放一段上下樓的動畫。」

    這就產生了極度割裂的體驗:AI 用「播放動畫」的方式優雅上樓,玩家卻在同樣的位置被卡住。你甚至會看到敵人沿著完全沒有人站過的路線移動,因為那段路線對 AI 來說是合法的連結,對玩家來說卻是不存在的空間。

    《黑暗靈魂》系列、《刺客教條》系列都大量使用這類技巧來處理複雜地形。它們不是「做壞了」,而是刻意用不同系統服務不同需求。

    五、不能走的樓梯,有時候是設計師故意的

    講完技術層面,該講設計層面了。而且必須說:很多「不能走的樓梯」是刻意設計的,而且設計得非常用心,只是你沒看出來。

    5-1 引導與邊界:用樓梯告訴你「此路不通」

    在關卡設計中,有一種手法叫「軟邊界」——不用一道明顯的牆擋住玩家,而是用環境語言暗示方向。一座被雜物堵住的樓梯、一座通往黑暗深處的樓梯、一座護欄已經斷裂的樓梯,都是在傳遞同一句話:「這裡不是現在該去的地方。」

    比起硬生生把你擋在空氣牆前,讓你能走上幾階然後發現「上不去」,反而更自然——因為現實中你也不會每次都走到頂才發現路封了。這種「可探索但不通行」的設計,能讓世界顯得更有說服力。

    還有一種更細膩的用法:用樓梯控制視線與節奏。讓玩家爬上樓梯後視野豁然開朗,是遊戲最經典的節奏手法之一。相對地,一段「看起來能走但實際上不去」的樓梯,可以讓玩家在低處多停留幾秒,把注意力留在設計師希望他看到的地方。

    5-2 戰鬥與視野控制:高低差就是戰術

    在多數動作遊戲裡,高低差直接等於戰術優勢。如果所有樓梯都能走,玩家就會找到一條「無限繞圈上下樓梯」的風箏路線,把 AI 耍得團團轉。因此設計師會刻意限制某些樓梯的通行性,或者讓它只有單向通行(例如只能從上往下跳,不能從下往上爬)。

    《生化危機》系列、《最後生還者》系列都擅長用這種方式控制戰鬥空間:樓梯是通道,但同時也是瓶頸。能不能走、從哪一端走,都是戰鬥設計的一部分。

    5-3 版本、載具與狀態差異:同一座樓梯,不同的你

    還有一類「不能走」來自角色狀態:

  • 載具限制:人類角色能走的樓梯,開車、騎馬、開機甲就上不去。這不是 Bug,是物理尺寸與坡度參數不同。
  • 負重與裝備:部分生存遊戲會依負重改變移動參數,超重時某些陡梯就爬不上去。
  • 形態切換:變身、縮小、巨大化之後,碰撞體尺寸改變,原本能過的樓梯可能變得太窄。
  • 受傷狀態:跛行、疲勞、體力耗盡時,移動速度與跨越能力下降。

    這些設計的共通點是:它不是要你卡住,而是要你意識到「角色現在的狀態不允許」。好的遊戲會給你明確反饋(喘息聲、提示、動畫),爛的遊戲則讓你一頭霧水。

    六、常見引擎與工具的參數對照

    如果你是想自己做遊戲、或者想更精確地理解「為什麼這座樓梯不行」,下面這張表可以當作快速參考。不同引擎的參數名稱不同,但概念是一致的。

    引擎 / 工具

    關鍵參數

    預設值(參考)

    對樓梯的意義

    Unity(CharacterController)

    Slope Limit / Step Offset

    45 度 / 0.3 公尺

    超過 45 度視為牆;單階高於 30 公分跨不上去

    Unreal Engine(CharacterMovement)

    Walkable Floor Angle / Max Step Height

    約 44.8 度 / 45 單位

    角度與台階高度雙重判定,且受移動模式影響

    Source 引擎(CS、HL2)

    PlayerStepSize

    約 18 單位

    經典的「蹲跳上箱子」就來自這個值

    Quake 系(sv_stepsize)

    sv_stepsize

    18 單位

    老遊戲樓梯多為斜坡,就是為了繞過這個限制

    NavMesh 烘焙(Recast)

    Max Slope / Max Step Height / Agent Radius

    依專案設定

    與玩家參數獨立,常造成 AI 與玩家行為不一致

    值得注意的是,這些數值在專案中經常被「微調」以配合特定關卡,所以你在不同遊戲、甚至同一遊戲的不同章節,都可能遇到行為不一致的樓梯。

    七、給玩家的排查指南:遇到走不上去的樓梯怎麼辦

    如果你現在正卡在某座樓梯前,先別急著退款。以下是一套實用的排查順序,可以幫你判斷「這到底是設計、Bug,還是我操作不對」。

  • 換角度與速度再試一次。很多卡住是膠囊體半徑與邊緣接觸造成的,斜著走、側著走、慢走、助跑,結果可能完全不同。
  • 試試跳躍或蹲下。有些樓梯的碰撞漏洞需要小跳才能觸發;有些狹窄樓梯則需要蹲下縮小碰撞體才能通過。
  • 切換移動狀態。收起武器、卸下負重、切換成步行、解除變身,很多「隱形限制」會立刻消失。
  • 觀察 NPC 與敵人。如果敵人能走上去而你不行,那你面對的是「AI 導航網格 vs 玩家控制器」的老問題,通常代表這座樓梯本來就不是給玩家走的。
  • 尋找替代路線。很多「不能走的樓梯」旁邊三步路就有一條能走的斜坡或梯子。設計師通常不會只留一條路。
  • 檢查版本與平台。樓梯碰撞是最容易在移植、重製、更新中出錯的部分。同一個位置在舊版本能走、新版本不能走,完全是常態。
  • 最後才考慮 Bug。如果以上全部無效,而且網路上大量玩家回報同一位置,那大概真的是碰撞體出包,等更新或找社群修補模組比較實際。
  • 額外提醒:在 VR 遊戲中,樓梯問題會被放大好幾倍。因為玩家的「身體」是頭盔,移動方式可能是瞬移或滑動,兩者對樓梯的判定邏輯截然不同。瞬移系統通常會直接禁止你傳送到高度差過大的位置,於是你會看到「明明只有三階,卻怎麼樣都傳不上去」的奇妙體驗。

    八、給開發者的檢查清單:讓樓梯不再成為玩家的惡夢

    如果你正在做遊戲,以下是一份實務檢查清單,可以大幅降低「樓梯不能走」的災情。

  • 統一規格:制定樓梯的標準階高(例如 18 公分)與標準坡度,寫進美術規範,並在建模工具中做成預製件。
  • 碰撞與視覺分離管理:樓梯的碰撞體獨立製作、獨立命名、獨立層級,避免美術改模型時誤改碰撞。
  • 參數留餘裕:如果角色 Step Height 是 45 公分,樓梯階高就不要超過 30 公分;Slope Limit 45 度,樓梯碰撞斜坡就不要超過 35 度。永遠留安全邊際。
  • 玩家與 AI 參數對齊:NavMesh 的烘焙參數應該與玩家控制器參數同步調整,並在每次關卡調整後重新烘焙。
  • 避免薄面碰撞:樓梯的碰撞體要有厚度,避免高速移動穿模;必要時在下方加保險層。
  • 處理邊緣與裝飾物:門檻、地毯、銅條一律不做碰撞,或做成極薄的裝飾層。
  • 自動化測試:用腳本讓角色從樓梯底部自動往上走,記錄是否成功、花費時間、是否抖動。這種測試可以一鍵跑完整張地圖。
  • 視覺提示:如果真的不打算讓玩家通行,請用環境語言明示(雜物、封鎖線、損壞的結構),不要只靠隱形牆。
  • 九、結語:樓梯是遊戲世界最誠實的一面鏡子

    樓梯看起來只是場景裡的一個小零件,但它其實同時考驗了碰撞系統、角色控制器、AI 導航、美術規範與關卡設計。一座能走的樓梯,代表這五個環節都對上了;一座不能走的樓梯,則是某個環節出了偏差——可能是技術限制,也可能是刻意為之。

    下次你在遊戲裡被樓梯卡住時,不妨換個角度想:你正親眼見證這款遊戲的底層邏輯。是斜坡碰撞體在作祟?是台階高度差了五公分?還是設計師在告訴你「這條路現在不該走」?當你開始這樣看遊戲,很多原本讓人抓狂的細節,反而會變成有趣的觀察點。

    而對開發者來說,樓梯永遠值得多花半天檢查。因為玩家可以原諒畫面不夠華麗、可以原諒劇情老套,但很難原諒——明明看得到階梯,卻走不上去。

    希望這篇文章能幫你在下一次「卡樓梯」時,少一點怒氣,多一點理解。也歡迎在雅寶社區 · 頂客論壇分享你遇過最離譜的樓梯體驗,我們一起來研究它到底是哪個環節出了問題。

    🏠 返回首頁