【Unity】物体(Rigibody组件)碰撞穿透、碰撞抖动

一、碰撞穿透

碰撞条件:主角(移动的物体)带有Rigibody组件;墙体(受力物体)带有Collider组件

穿透的原因:
1.主角移动速度太快,墙体的Collider厚度太薄
2.主角和墙体都以一定的速度移动,发生的碰撞穿透

解决:
我们先来了解下刚体(rigidbody)属性参数:Collision Detection(碰撞检测):
三种选项:Discrete(离散),Continuous(连续),Continuous Dynamic(动态连续)。
参考下官方的解释:该属性用于控制避免高速运动的游戏对象穿过其他的对象而未发生碰撞,有三项可供选择:

  • Discrete:离散碰撞器。该模式与场景中其他的所有碰撞体进行碰撞检测。该项为默认值。
  • Continuous:连续碰撞检测。该模式用于检测与动态碰撞体(带Rididbody)的碰撞,使用连续碰撞检测模式来检测与网格碰撞体(不带ridigbody)碰撞。(添加一句原文翻译漏了),Rigidbody设置为连续动态碰撞检测模式将使用连续碰撞来检测。其他刚体会采用离散碰撞模式。此模式适用于那些需要与采用连续动态检测的对象相碰撞的对象。这对物理性能会有很大影响。如果不需要对快速运动对象进行碰撞检测,就使用离散碰撞检测模式。
  • Continuous Dynamic:连续动态碰撞检测模式,该模式用于检测与采用连续碰撞撞模式或连续。
  • 动态碰撞模式对象的碰撞,也可用于检测没有rigidbody的静态网格碰撞体。对于与之碰撞的其他对象可采用离散碰撞检测。动态连续碰撞检测模式也可用于检测快速运动的游戏物体。
    翻译就是这样的理解并不难:后面两项就是为了用来能够检测到快速运动的物体不至于你的void OnCollisionEnter(Collision hit)函数检测不到,而至于一个为Continuous Dynamic的刚体和一个Discrete的刚体碰撞,前者会使用使用Continous(连续)碰撞,后者离散碰撞

方案:
1.当使用默认的离散式碰撞检测时,如果前一桢时对象在墙这一面,下一桢时对象已到到了墙另一面,那么碰撞检测算法将检测不到碰撞的发生,你可以将该对象的碰撞检测属性设置为Continuous,这时碰撞检测算法将会防止对象穿过所有的静态碰撞体,设置为Continuous Dynamic将还会防止穿过其他也设置为Continuous或者Continuous Dynamic的刚体

2.如果说通过以上设置我们发现还不能解决穿透的问题,那我们应该去检查下控制主角移动的代码是否不在在FixUpdate中。Update和FixUpdate都有时间间隔进行刷新的,更新的时候是用基础速度*时间,很有可能这个结果计算出来的时候车已经冲过了被碰撞体,就导致了我们的角色穿透,或者卡在被碰撞器的里面。
建议:发生穿透时,调整墙体的厚度和摆放位置,为墙体添加Rigibody组件并根据实际情况选择合适的Collision Detection属性值;主角的移动控制代码一定要放在FixUpdate中处理。

二、主角(移动物体)碰撞时颤抖

原因:移动物体加刚体后,在Update中每一帧的时间不一样,造成物体受力不均匀,物体发生碰撞时抖动;或者使用Translate()的方式控制移动。

解决方法:

1.使用刚体AddForce()方法或者 velocity属性控制主角的移动
2.将控制代码放在FixedUpdate中处理。
3.查看人物自己的子物体下面是不是还有其他的刚体

  • 17
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值