Re: [請益] Unity-橫向卷軸的移動控制

作者: cjcat2266 (CJ Cat)   2016-03-27 11:34:43
※ 引述《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)",只是比較消耗資源
作者: wix3000 (癢,好吃)   2016-03-27 18:50:00
感謝回應,嗯~所以果然沒有簡單設定就能實現的方法嗎
作者: juicefish (果汁魚)   2016-03-28 00:47:00
Unity用物理引擎解的話 應該是調整重量或重力
作者: cjcat2266 (CJ Cat)   2016-03-28 08:26:00
還是有可能會浮空,仍需要額外邏輯把角色確實釘在地上要做出緊密操控的平台動作遊戲,只靠物理模擬是不夠的玩家對緊密操控的期望,是其確定性(determinism)全依賴物理模擬而不用額外邏輯,極有可能破壞這項期望主打緊密操控,只要有1%機率會浮空,就會讓玩家不爽
作者: johnny94 (32767)   2016-03-28 11:35:00
同意,尤其是很吃操作的動作遊戲,更是不能仰賴通用的物理引擎
作者: azureblaze (AzureBlaze)   2016-03-28 14:41:00
不釘地板其實也可以靠n個frame內有碰到地板就算著地這樣可以處理稍微飄起來的狀況,個人試起來感覺還不錯在遊戲界「簡單設定就能實現」的效果通常不是你要的需求變化實在太多了,除非你想要看起來千篇一律
作者: wannasaynone (阿魂本命)   2016-03-29 10:09:00
推實用
作者: sdsg5bpnl   2016-03-30 21:11:00
實用推
作者: lemmii   2016-03-30 22:48:00
push

Links booklink

Contact Us: admin [ a t ] ucptt.com