Unity 获取碰撞前一刻的速度

在获取碰撞对象的初速度时,如果直接调用OnCollisionEnter(Collision collision) 中的collision.collider.velocity, 所获取的速度其实是碰撞对象在碰撞发生后的速度,一个典型的现象就是假如在发生碰撞前如果碰撞对象的速度为0,但在碰撞判断时所获得的速度却不为0, 而是碰撞发生瞬间后,物理引擎后一帧的速度!这将对碰撞判断造成非常严重的影响。

Unity 似乎没有在文档中明确说明这一点,但我觉得这很可能和Unity的周期循环顺序有关,如图,物理的碰撞Internal Physics update似乎发生在OnCollisionEnter接口之前,导致通过OnCollisionEnter获取的物体速度晚于实际碰撞发生时刻!

Script Lifecycle Flowchart. The following diagram summarises the ordering and repetition of event functions during a script’s lifetime.

在经过反复的尝试后我找到一个解决方案,即在每一个可能会要计算碰撞伤害的物体上附加一段代码,这段代码将有一个public的变量记录着物体的实时速度,将代码放置在Update循环中,由于Update晚于OnCollisionEnter(),这样可以确保物体在被碰撞之后该数据才会被刷新覆盖,这样就能一直记录着物体上一个周期循环的速度, 放在FixedUpdate循环中同样也可以,FixedUpdate发生的最早,所以初始速度可在发生碰撞之前就准备好了。这样在碰撞时获取该数据,两种方法都能获得物体碰撞前一刻的速度了:

要判断碰撞物体的部分脚本:

[SerializeField] Rigidbody rb; // player
public Vector3 Player_Velocity;
  void Awake()
    {
        rb = GetComponent<Rigidbody>();
       
    }

void FixedUpdate()//or Update()
    {
        Player_Velocity = rb.velocity;
//since the collision will get the late velocity that gives wrong damage, so we need to get the velocity in fixed update (earlier)
         }	

碰撞检测和判断,放在其它物体脚本中:

   void OnCollisionEnter(Collision collision)
    {
        if (rb.velocity.magnitude < other_Player_Velocity.magnitude)
        { 
            //这样就能够获取碰撞前另一个物体的初速度(other_Player_Velocity)了              
            //Do something
        }
    }

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bunny Chen

来啊来让我发家致富,一毛钱可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值