※ 引述《wix3000 (癢,好吃)》之銘言:
: 當腳色從上坡切換到下坡時,會因為慣性浮空一小段時間
: 只是就個人的遊戲經驗,大部分的橫向卷軸遊戲在高低差表面上移動時都是平貼著地面的
: 不知道這個部分是運用到了什麼機制讓它們能夠平貼著
: 或者說有什麼更好的架構來處理移動功能?
這就要談到平台動作遊戲(platformer)角色移動機制的一道分水嶺
看你是要 "物理模擬(physics-based)" 還是 "緊密操控(tight control)"
物理模擬為主的遊戲
就是用你的做法,設定角色的速度,然後交給物理引擎去模擬
像小小大星球就是這種作法
優點是可以很容易地讓角色跟環境做物理互動,因為角色也是物理模擬的一部份
缺點就像你說的,角色會有 "浮浮的感覺(floaty)" 而抓地困難
大部分平台動作遊戲採用緊密操控的作法
角色不屬於物理引擎模擬的一部份,與環境的互動是用額外的邏輯去處理
本世代遊戲的作法,是用 "射線投射(ray cast)" 將角色"釘"在地上
假設+Y軸為正上方
角色移動的時候,先決定下個frame的XZ位置
然後往-Y方向做ray cast,找出把角色"釘"在地上的正確Y軸位置
如此一來,角色就會緊緊的抓住地面
處理跳躍的時候,也不依靠物理引擎,而是直接對transform的Y分量做修改
當角色在空中落下的時候
每個frame在當時位置和下個frame的預期位置形成的線段,對地面做碰撞偵測
如果線段與地面沒有相交,那就按照預期位置更新角色位置
若有相交,則把角色的位置設定到交點,這樣角色就著地完成了
以上是處理Y分量的方式
處理XZ分量的方法就有很多種,端看環境的碰撞資料格式
也有混搭的作法
角色移動用設定速度和物理模擬的方式更新
但是每個frame也做-Y方向的ray cast,找出抓地點
如果抓地點沒有離角色太遠,就直接設定transform的Y分量,把角色重新"釘"回地上
補充:依照需求,除了ray cast
也可以考慮 "形狀投射(shape cast)",只是比較消耗資源