- 写在前面:谈到游戏引擎,就不得不谈碰撞。碰撞可谓是所有物理特效中最基础,最实用的了。今天这篇笔记记录的就是我最近实用unity引擎中遇到的和碰撞有关的一些内容。
Unity碰撞发生条件:
在unity中,两个物体要想发生碰撞,必须满足以下2个前提条件:
1.两个物体都具有collider或继承了collider的组件
2.其中一个物体具有rigibody(刚体)组件
Unity碰撞过程:
在unity引擎中提供和碰撞相关的API有这样几个:OnCollisionEnter(),OnCollisionExecute(),OnCollisionExit()。从字面意义上看,三个函数似乎是表示碰撞前,碰撞时,碰撞后的瞬间,因此如果我们想要对碰撞做一些修改似乎是可以在这几个函数中实现。
然而事实却并非如此!!!!!
经过我多次试验发现,无论在Enter,Execute还是Exit中,当你想要调用函数获取当前的各项物理属性(速度,位置等),这时候拿到的物理属性都是碰撞过后的属性!!!天坑啊!!!
为什么会是这样呢,其实我后来想了想,unity这么做也是有一定道理的。至于为什么,可以用这么一句话来解释“因为在引擎中,除非两个物体真的发生碰撞了,不然unity无法判断两个物体到底有没有碰撞!”试想一下,当两个物体离得很近很近的时候,看上去是有可能要发生碰撞了,但是没有人知道下一秒这两个物体会不会就相对静止!没有发生的事情怎么预测呢!人可以凭借直觉,但是目前来看,unity是做不到这一点的。所以就目前我了解到的来看,无论是执行Enter,Execute还是Exit函数,都是在unity计算好了碰撞后的物理属性以后才执行的。
如果我就想拿到碰撞前的速度呢?
那么问题来了,如果我们想拿到碰撞前的一些属性怎么办呢?比如我就是想拿到碰撞前一瞬间两个物体的速度应该怎么办呢?我也想到了一个野路子方法:给其中一个物体挂一个脚本,让它复制一个这个物体的meshcollider,并把它放大一点点,比如scale乘上个1.01这种,然后再把这个meshcollider设置成OnTrigger,只用作触发,这样的话在这个“放大”了一点点的meshcollider与另一个物体触发时,我们就可以拿到另一个物体的速度了是不是?这个速度就可以认为是碰撞前的速度了。
PS:其实我认为unity引擎应该是可以提供碰撞前的速度的,因为引擎本身计算碰撞效果的时候肯定是需要用到碰撞前的速度的,但是为什么unity没有对外开放这个接口,我也不知道为什么。说不定在以后版本的unity就可以见到了(反正目前的5.4版本我是没见到)!