遊戲裡的樓梯為什麼有的可以走有的不行
這也是為什麼老遊戲的樓梯走起來總有一種「滑上去」的錯覺,而且角色模型會微微浮在階梯上方——因為角色的腳實際踩在斜坡上,而不是踏面上。
二、角色控制器的兩道門檻:坡度極限與台階高度
現代遊戲大多採用「膠囊體 + 掃掠檢測」的角色控制器(Character Controller)。它不像真實物理物件那樣被重力與碰撞推來推去,而是由程式主動決定「這一步能不能移動過去」。而在這個判斷過程中,有兩個參數決定了樓梯的生死。
2-1 斜坡極限角(Slope Limit):太陡就是牆
角色控制器通常會設定一個「可站立坡度上限」,常見數值是 45 度或 46 度。當角色前方偵測到的表面傾斜角超過這個值,系統就會把它視為「牆壁」而不是「地板」,角色不會沿著它往上滑,而是直接被擋住、甚至往下滑落。
這個設計的用意是防止玩家爬上不該爬的地方,例如峭壁、屋頂斜面。但問題來了:如果樓梯的碰撞體是斜坡,而那個斜坡的角度超過了 Slope Limit,樓梯就會瞬間變成峭壁。
這種事情比你想的更常見。原因包括:
美術人員做的樓梯視覺角度偏陡(例如 50 度),碰撞人員照著拉斜坡,結果直接超過極限。
樓梯的碰撞斜坡為了「包住」階梯的凸出邊緣,起點與終點被往外拉,實際角度比視覺上更陡。
實務上還有一個經典陷阱:斜坡的「法線」計算。如果碰撞體由多個小三角形拼成,而某個三角形的法線因為頂點焊接不良或縮放不均而歪掉,那個區域算出來的角度就會異常,於是出現「樓梯一半能走、一半卡住」的詭異現象。
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 公分——理論上完全沒問題。
那為什麼還是會卡?幾個常見原因:
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 版本、載具與狀態差異:同一座樓梯,不同的你
還有一類「不能走」來自角色狀態:
受傷狀態:跛行、疲勞、體力耗盡時,移動速度與跨越能力下降。
這些設計的共通點是:它不是要你卡住,而是要你意識到「角色現在的狀態不允許」。好的遊戲會給你明確反饋(喘息聲、提示、動畫),爛的遊戲則讓你一頭霧水。
六、常見引擎與工具的參數對照
如果你是想自己做遊戲、或者想更精確地理解「為什麼這座樓梯不行」,下面這張表可以當作快速參考。不同引擎的參數名稱不同,但概念是一致的。
引擎 / 工具
關鍵參數
預設值(參考)
對樓梯的意義
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,還是我操作不對」。
額外提醒:在 VR 遊戲中,樓梯問題會被放大好幾倍。因為玩家的「身體」是頭盔,移動方式可能是瞬移或滑動,兩者對樓梯的判定邏輯截然不同。瞬移系統通常會直接禁止你傳送到高度差過大的位置,於是你會看到「明明只有三階,卻怎麼樣都傳不上去」的奇妙體驗。
八、給開發者的檢查清單:讓樓梯不再成為玩家的惡夢
如果你正在做遊戲,以下是一份實務檢查清單,可以大幅降低「樓梯不能走」的災情。
九、結語:樓梯是遊戲世界最誠實的一面鏡子
樓梯看起來只是場景裡的一個小零件,但它其實同時考驗了碰撞系統、角色控制器、AI 導航、美術規範與關卡設計。一座能走的樓梯,代表這五個環節都對上了;一座不能走的樓梯,則是某個環節出了偏差——可能是技術限制,也可能是刻意為之。
下次你在遊戲裡被樓梯卡住時,不妨換個角度想:你正親眼見證這款遊戲的底層邏輯。是斜坡碰撞體在作祟?是台階高度差了五公分?還是設計師在告訴你「這條路現在不該走」?當你開始這樣看遊戲,很多原本讓人抓狂的細節,反而會變成有趣的觀察點。
而對開發者來說,樓梯永遠值得多花半天檢查。因為玩家可以原諒畫面不夠華麗、可以原諒劇情老套,但很難原諒——明明看得到階梯,卻走不上去。
希望這篇文章能幫你在下一次「卡樓梯」時,少一點怒氣,多一點理解。也歡迎在雅寶社區 · 頂客論壇分享你遇過最離譜的樓梯體驗,我們一起來研究它到底是哪個環節出了問題。
💬 想說點什麼?
歡迎到留言板分享你的想法、心得或疑問。
💬 前往留言板 →