温馨提示:本文基于前一篇“Unity的碰撞检测(四)”继续探讨两个游戏对象具备刚体的BodyType均为Dynamic,但是Collision Detection属性不同的碰撞检测,阅读本文则默认已阅读前文。
(一)测试说明
在基于两个游戏对象都具备碰撞器和刚体的前提下,如果碰撞器属性一致,二者刚体的属性除了Collision Detection不固定,其它属性保持一致。那么会对碰撞检测产生什么影响?事实上,Collision Detection属性并不是决定两个游戏对象是否发生碰撞的因素,而是决定二者如何发生碰撞的因素,所以测试指标我们还需要添加一个”是否高速碰撞”,高速碰撞通过Rigidbody2D.AddForce方法实现,力的大小数值为100,ForceMode2D保持默认,但是对于非高速碰撞的界定无法确认,根据实际应用中碰撞时的情况灵活选择Discrete或Continous。
本次测试我们约定如此:Player与Enemy都具备碰撞器和刚体,且二者的刚体的BodyType均为Dynamic,默认属性如图1和图2所示:
(二)测试用例
游戏对象 | 测试用例序号 | Discrete | Continuous | 是否高速碰撞 |
Player | A1 | √ | × | √ |
A2 | √ | × | × | |
A3 | × | √ | √ | |
A4 | × | √ | × | |
Enemy | B1 | √ | × | √ |
B2 | √ | × | × | |
B3 | × | √ | √ | |
B4 | × | √ | × |
组合序号 | 测试用例组合 | 测试结果 |
G1 | A1、B1 | 1.Collider输出无碰撞穿透 2.碰撞穿透无Collider输出 3.Collider输出且碰撞穿透 |
G2 | A1、B2 | 1.Collider输出无碰撞穿透 2.碰撞穿透无Collider输出 3.Collider输出且碰撞穿透 |
G3 | A1、B3 | Collider输出无碰撞穿透 |
G4 | A1、B4 | Collider输出无碰撞穿透 |
G5 | A2、B1 | 1.Collider输出无碰撞穿透 2.碰撞穿透无Collider输出 3.Collider输出且碰撞穿透 |
G6 | A2、B2 | 无 |
G7 | A2、B3 | Collider输出无碰撞穿透 |
G8 | A2、B4 | 无 |
G9 | A3、B1 | Collider输出无碰撞穿透 |
G10 | A3、B2 | Collider输出无碰撞穿透 |
G11 | A3、B3 | Collider输出无碰撞穿透 |
G12 | A3、B4 | Collider输出无碰撞穿透 |
G13 | A4、B1 | Collider输出无碰撞穿透 |
G14 | A4、B2 | 无 |
G15 | A4、B3 | Collider输出无碰撞穿透 |
G16 | A4、B4 | 无 |
(三)测试总结
分析1:由G1、G2和G5可知当Player和Enemy的刚体的Collision Detection均为Discrete时,无论二者谁进行高速碰撞测试结果都不稳定。
分析2:由G3、G4、G7、G9-G13和G15可知Player和Enemy的刚体的Collision Detection至少有一个为Continous时,无论二者谁进行高速碰撞测试结果都是Collider输出无碰撞穿透。
根据上述分析可得以下结论:
结论1:两个游戏对象在发生有效碰撞的前提下,要能够正确进行碰撞检测和避免碰撞穿透则至少有一个游戏对象的刚体的Collision Detection为Continous。
(四)问题
本文针对两个游戏对象在满足有效碰撞的前提下,对于二者的刚体的BodyType均为Dynamic,但是二者的Collision Detection属性不同而产生不同的碰撞检测结果进行探讨。那么对于一个游戏对象的刚体的BodyType为Dynamic,另一个为Kinematic,而二者的Collision Detection属性不同会产生什么样的碰撞检测结果呢?我们在下一篇“Unity的碰撞检测(六)”继续探讨吧。
如果这篇文章对你有帮助,请给作者点个赞吧!