最近在做2D游戏,所以经常使用到两个检测碰撞的方法。
OnCollisionXX()方法或OnTriggerXX方法,两个方法的使用大致相同,传入的参数略有差别:
void?OnCollisionEnter2D(Collision2D?collision) { }
void OnTriggerEnter2D(Collider2D?collision) { }
一个是Collision2D,一个是Collider2D,使用上大致也差不多。
?以前没注意到具体的区别,甭管是 Collision 方法还是 Trigger 方法一律collision.gameObject.CompareTag ("Tagxxxx")?也没出现过什么差错,直到今天报错才意识到,两个方法collision.gameObject返回的对象并一定不相同。
如果你所有的Collider 与 RigidBody 都挂在同一个对象上,就不用继续往下看了
具体的区别在于这种情况:
?- 假设?Root?对象有几个子对象。Rigidbody放在父对象上,而Collider放在某一个子对象上——比如“Collider child”(图就不截了)
为什么要这么做呢?有时,我不需要游戏对象发生任何运动、位移,但需要某些子对象和碰撞器运动。比如一个“可以将拳头随意挥舞的石头巨人”
当这个对象被子弹击中时,我想知道子弹击中了谁。我想得到?Root 对象,进而可以获取对象挂载的其他脚本。
子弹检测到的碰撞器是 Collider child 。
这时,使用参数collision时,collision.gameObject 返回的对象:
- Collision方法:collision.gameObject 表示参与碰撞的对象,也就是 Root
- Trigger方法:collision.gameObject 表示collider所挂载的对象,是 Collider child
由于这次我使用的是Trigger方法,返回了Collider child,无法获取脚本,于是获取了一个空引用报错。
正确做法:
- Collision方法:collision.gameObject
- Trigger方法:collision.attachedRigidbody.gameObject
|