最近在做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上,而碰撞器(也许一个,也许有多个)在子对象上。
当这个对象被子弹击中时,子弹监测到了碰撞,我要获取这个对象。我要得到的是 Root 对象,进而可以获取对象挂载的其他脚本。
子弹检测到的碰撞器是 Collider child 。
这时,使用参数collision时,collision.gameObject 返回的对象:
- Collision方法:collision.gameObject 表示参与碰撞的对象,也就是 Root
- Trigger方法:collision.gameObject 表示collider所挂载的对象,是 Collider child
由于这次我使用的是Trigger方法,返回了Collider child,无法获取脚本,于是获取了一个空引用报错。文章来源:https://www.toymoban.com/news/detail-431615.html
正确做法:文章来源地址https://www.toymoban.com/news/detail-431615.html
- Collision方法:collision.gameObject
- Trigger方法:collision.attachedRigidbody.gameObject
到了这里,关于【unity笔记】OnCollision和OnTrigger方法使用的一个误区【2D】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!