Notifications
Article
[原创] 2D带斜坡地形的碰撞检测(附设计思路)
Published 18 days ago
70
0
转自nobidagu发表于原Unity中国论坛
2D带斜坡地形系统设计
需求是实现一个2D的平台地形系统,要保证角色,释放物,等等收到地形影响而不会穿透过去.
角色的位移可以由走,跳,释放技能,被击退,被击飞,等等状态来控制.
因为自带的物理系统自修正会有帧延迟的问题,所以无法采用.
因为位移是与状态无关联的,所以需要实现一个通用的物理碰撞计算公式, 所以设计成从角色当前的位置(currentPosition)移动到目标位置(targetPosition)之前, 物理计算一下, 保证角色不会穿透过去, 斜坡演示视频如下.

碰撞盒子有BoxCollider2D, EdgeCollider2D, 为了实现斜坡的功能,和编辑上达到无缝连接,所以采用了EdgeCollider2D,以点的方式相连起来,因为如果用BoxCollider2d,则需要用编辑器,实现功能才能达到顶点的无缝连接,而且还可能出现float类型的精度问题,导致穿透下去,如下图


unity提供的2D物理检测系统有 Raycast(射线检测), Cast(碰撞检测).

关于斜坡的功能,我的思路是,斜坡就是地板,必须在角色发生位移的时候,将角色修正到斜坡的交点位置, 所以我采用了射线检查,从当前点发一条射线到目标点,如果有检测到碰撞,则说明穿过了斜坡,则从角色目标点的位置向上发一条射线, 把目标点修正到上方位置.

左移的时候同理从目标点向下发一条射线 把目标点修正到下方的位置,以紧贴住地面.

到这里,斜坡的功能已经实现,视频里面已经有演示过.

接下来,要考虑墙壁的问题了, 纯墙壁的问题很好解决,只要把角色修正到当前点与墙壁的交点,再稍微往回拉一点点保护距离就可以了.

但是墙壁与地板的交界处,就有问题了,先来看看这种情况.

如图所示,分别演示了两种情况,那么如何将角色修正呢,当然还是发一条射线,然后修正到交点处,再加一点保护距离就可以了,真的是这样么?
没那么简单,首先来看第一种情况,如果直接修正到交点处,那么角色就会一直卡在交点处,无法掉落下来,因为下一帧后,角色的当前点就变为了交点,然后从交点发射线,便会一直卡交点处了,所以必须把点修正下方的位置才是正确的, 这样可以保证, 角色在朝着墙壁跳跃或下落时, Y轴不会受到影响,如下图
照着这个思路,我们先修正墙壁,再将角色修正到目标点,这样就可以保证朝着墙壁移动的时候,角色可以自由的跳跃与下落
然后是第二种情况,演算过程和上面的差不多, 但是需要先修正地板,然后再修正墙壁,正确的结果应该如下图所示


那么问题来了, 到底是先修正墙壁,还是先修正地板呢?因为连着的线无法获知线段是横线还是竖线,我尝试用这样的方式来进行判断,

结果还是有穿透的现象发生,暂时没有查明原因,可能是由于float类型的精度损耗导致, 但是我已经把射线的检测长度乘以2了,依然无效,因为EdgeCollider2dD无法得到交点在哪一段线上面,所以至此, 线段的横竖,已经无法解出来, 只能采用其他取巧的方式来判断, 这样又不是我希望的, 如果关于带斜坡的2D地形检测系统,哪位还有什么好的方案,欢迎提出来,希望能一起讨论.

Tags:
游戏汪
profile - Manager
5
Comments