※ 引述《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)",只是比较消耗资源