关于OnCollisionEnter2D和OnTriggerEnter2D两种碰撞触发

一:产生碰撞的条件

1:若要产生碰撞,必须双方都要有碰撞器。

2:运动的一方一定要有刚体,另一方有无刚体无所谓,但需要注意的是如果是静止的物体带刚体,一开始效果跟运动的物体带刚体一样,但由于刚体放在静止的物体上会休眠,所以一般要将刚体放在运动的物体身上。简而言之就是至少要有一方有刚体,一般为运动方。

注:如果运动的一方无刚体,它去碰撞静止的不带刚体的物体,相当于没有撞上,即使双方带碰撞体也会相互穿过。

       如果运动的一方有刚体,它去碰静止的不带刚体的物体(即没有物理演算),则该物体不会因为被碰撞而发生移动。

总的来说,如果想要两个物体碰撞后都有因为物理演算而发生位移,则双方都要有刚体和碰撞器。

二:接触的两种方式

1:Collision碰撞,造成物理碰撞,可以在碰撞时执行OnCollision事件。

2:Trigger触发,取消所有的物理碰撞,可以在触发时执行OnTrigger事件。

注:两个物体接触不可能同时产生碰撞+接触,最多产生一种。但是可以AB产生碰撞,AC产生触发。

三:产生不同方式接触的条件

1:Collision碰撞

     (1):双方都有碰撞体

     (2):运动的一方必须有刚体

     (3):双方不可同时勾选Kinematic运动学。

     (4):双方都不可勾选Trigger触发器。

2:Trigger触发

     (1):双方都有碰撞体

     (2):运动的一方必须是刚体

     (3):至少一方勾选Trigger触发器

四:接触后事件细分为Enter,Stay,Exit三种(以Trigger为例,分别为OnTriggerEnter、OnTriggerStay、OnTriggerExit)

1:Enter事件表示两物体接触瞬间,会执行一次。

2:Stay事件表示两物体持续接触,会不断执行。

3:Exit事件当两物体分开瞬间,会执行一次。

五:OnTriggerEnter这类的属于Trigger触发,OnCollisionEnter这类的属于Collision碰撞

总结:OnTriggerEnter和OnCollisionEnter的选择。

如果想实现两个刚体物理的实际碰撞效果时候用OnCollisionEnter,Unity引擎会自动处理刚体碰撞的效果。

如果想在两个物体碰撞后自己处理碰撞事件用OnTriggerEnter。

OnTriggerEnter2D :触发器 和 OnCollisionEnter2D:碰撞器
①触发器是碰撞器的一个功能
②在想要做碰撞检测时使用碰撞器
③碰撞器生效的必要条件,碰撞的双方A,B都必须都Collider,其中有一方要带有rigidbody。
④当想要做碰撞检测却又不想产生碰撞效果时,就可以用isTrigger,在这个状态下触发检测生效,碰撞检测失效。

例子 一个物体与多个其他物体做碰撞检测应怎样写。
当两类物体需要相互碰撞,应尽可能的用某一方来检测,以避免 两者碰撞触发时机不确定,谁先谁后不确定的问题。
我在做一个弹跳的主角(A)碰到元素(B,有很多),时 需要给主角触发一个反弹效果,还需要将元素隐藏。 起初,我把A的触发效果写在A的碰撞检测里面 ,B的隐藏方法写在B的碰撞检测里面。 这样的话 就会发现 A 碰到B的时候,A有时候能触发反弹效果,有时候却不能,但是B都是隐藏了。 究其原因是,A和B相互碰撞时,两者的碰撞检测谁先谁后是不确定的,有可能A先检测到,也有可能B先检测到。
如果是A先检测到,那好没问题,效果可以触发,然后B检测到,B消失。
可如果是B先检测到,那B就消失了,这时候A是检测不到B的,因为B已经消失,所以A的效果也就没触发。 就会有上面描述的很奇怪的现象了。
避免这类情况发生,应将碰撞检测时想要触发的效果和方法都写在一边! 一开始我全部写在A里面,又出现问题了,A的反弹效果和B消失都能执行,但每次只能执行一次,A一次碰到多个B的时候,按照逻辑,应该将碰到的多个B都消失,可这样的写法,只能将检测到的第一个B消失,然后执行反弹效果,脱离了与其他未消失B的检测范,导致B不能执行消失方法。 这样不好。
最佳办法是,将检测写在B里面,当A接触到B时,B每一个都自己来检测A,A能执行效果,B也能正常消失。
————————————————
版权声明:本文为CSDN博主「彩色墨水」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44186849/article/details/98878626

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值