【unity笔记】OnCollision和OnTrigger方法使用的一个误区【2D】

最近在做2D游戏,所以经常使用到两个检测碰撞的方法。

OnCollisionXX()方法或OnTriggerXX方法,两个方法的使用大致相同,传入的参数略有差别:

void OnCollisionEnter2D(Collision2D collision) { }
void OnTriggerEnter2D(Collider2D collision) { }

一个是Collision2D,一个是Collider2D,使用上大致也差不多。

以前没注意到具体的区别——甭管是 Collision 方法还是 Trigger 方法,要想获取检测到的对象,一律使用传入的参数.gameObject (例如collision.gameObject.CompareTag ("Tagxxxx") ),没出现过什么差错,直到今天报错才意识到,两个方法collision.gameObject返回的对象并一定不相同。


如果你同个对象的Collider 与 RigidBody 均挂在同一个层级上,且所有的物体皆是如此设计,就不用继续往下看了


具体的区别在于这种情况:

 - 假设一个物体有多个层级——如下图:Root 对象有多个子对象。Rigidbody放在父对象上,而Collider放在某个子对象上——比如“Collider child

为什么要这么做呢?有时,我不需要游戏对象发生任何运动、位移,但需要某些子对象和碰撞器运动。

比如一个“可以将拳头随意挥舞的石头巨人”,那么它的刚体可能在Root上,而碰撞器(也许一个,也许有多个)在子对象上。

【unity笔记】OnCollision和OnTrigger方法使用的一个误区【2D】_第1张图片

当这个对象被子弹击中时,子弹监测到了碰撞,我要获取这个对象。我要得到的是 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

你可能感兴趣的:(Unity,/个人/无意义记录,unity,游戏引擎)