unity 碰撞和检测的区别

一,基本碰撞和触发器的基本概念
   1>什么是碰撞器
       碰撞器是一群组件,它包含了很多种类,比如: Box Collider 盒碰撞器、Capsule Collider 胶囊碰撞器、Mesh Collider 网格碰撞器、Sphere Collider 球碰撞器  等等这一类组件,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
   2>什么是触发器
        所谓触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。
   3>区别
       碰撞器
     (1)碰撞器有碰撞效果
     (2)IsTrigger=false
     (3)碰撞信息检测
           MonoBehaviour.OnCollisionEnter(Collision collision) 
           MonoBehaviour.OnCollisionExit(Collision collision) 
           MonoBehaviour.OnCollisionStay(Collision collision) 
      触发器
    (1)触发器没有碰撞效果
    (2)IsTrigger=true;
    (3)触发信息检测:
           MonoBehaviour.OnTriggerEnter(Collider collider)
           MonoBehaviour.OnTriggerExit(Collider collider)
           MonoBehaviour.OnTriggerStay(Collider collider)
二,触发和碰撞的信息检测方法
  1>触发信息检测:
      1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器
      2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器
      3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器
  2>碰撞信息检测:
     1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
     2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
     3.MonoBehaviour.OnCollisionStay( Collision collisionInfo )  当逗留碰撞器
以上这六个接口都是MonoBehaviour的函数,由于我们新建的脚本都继承这个MonoBehaviour这个类。所以我们的脚本里面可以覆写这六个函数。
我们就需要完善的了解一下有关碰撞器方面的知识啊。我把我们还得了解的概念列举如下:

1.Static Collider 静态碰撞器

   指的是没有附加刚体而附加了碰撞器的游戏对象。这类对象会保持静止或很轻微的移动。这对于环境模型十分好用,比如刚体和墙面碰撞时而不会移动。
2.Rigidbody Collider 刚体碰撞器
   指的是附加了刚体和碰撞器的游戏对象。
3.Kinematic Rigidbody Collider 运动学刚体碰撞器
   在第2点得基础上勾选了刚体组件中的IsKinematic属性,如果要移动这类对象,就只能修改它的Transform,而不是用力。这类游戏对象还有许多其他的独特的使用情景。

这三种碰撞器如果勾选了IsTrigger复选框,就变成了相应的触发器了。

三,碰撞和触发的必要条件
   1>碰撞测试
       需要碰撞体(Collider),那么是不是只要有Collider就可以发生碰撞了呢?
        

      图为两个只加了Collider的cube,运行后两个cube发生了穿越;        

      此时我们为红色的cube加一个刚体
        
       图为红色cube碰撞蓝色cube后自己被弹飞了,而蓝色cube却毫发无伤;
       如果是蓝色碰红色则还是会发生穿越;
       同理,如果是蓝色加了刚体而红色未加,那么和上面的情况则是相反的。
       现在我们把两个cube都加上刚体
       
      两个cube都被弹开了,即都发生了碰撞。
      为了更加直观的看出结果,下面列一个表格:
     
  2>碰撞结论
      1、如果两个物体,只要有一个没有Collider,即使任意一个物体有rigidbody,都会发生穿越(即,没Collider就穿越);
      2、如果两个物体都有Collider,有rigidbody的物体会发生碰撞,而没有rigidbody的一方则不会受到影响(注意一下谁碰谁);
      3、如果两个物体都有Collider,无rigidbody的物体碰有rigidbody的物体,则并不会发生碰撞
(易忽略,单独拿出来讲。另外这种情况下,当高速移动无rigidbody的物体时,偶尔会出现发生碰撞的现象,不知道是不是unity的一个bug)
   综上,两物体发生碰撞的必要条件是:
      两个物体都必须带有碰撞器(Collider),其中至少一个物体带有Rigidbody刚体。(只有带Rigidbody刚体的一方会受到物理引擎的影响)
      可能会有人想如果为物体都加上刚体不就不需要这么纠结了吗?
有两方面原因:
      一是游戏场景物体很多,都加刚体,系统的开销会很大;
      二是有时候我就需要其中一个物体是不动的,比如地面。
  注意:
      1 在一次碰撞中,“刚接触”和“接触完”只被调用一次,而“碰撞中”则是在接触时一直被调用。
      2 、函数的参数则是被撞的那个物体 。我们可以通过此参数获取被撞物体信息。
  3>触发测试
       碰撞信息检测的例子不变,我们只把蓝色cube的IsTrigger勾上
       
       再运行试试,这时,发现原来的碰撞信息不见了,并且红色cube穿过了蓝色cube
        
       此时在蓝色cube上加上以下代码:
       

 
可见IsTrigger的作用是忽略物理引擎的影响,没有碰撞效果(OnCollisionEnter/Stay/Exit函数也就会失效了),并可以调用OnTriggerEnter/Stay/Exit函数。
注意:OnTriggerEnter(Collider collider)和OnCollisionEnter(Collision collision)不能同时使用。
和碰撞实验一样,我们也来做一个表格看看刚体和触发器的关系
和上面的例子代码不同,我们稍微修改一下代码: 
红色cube上的脚本:

蓝色cube上的脚本: 





   4>触发结论
(由于碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性,要触发必然需要碰撞器,所以表中并没有Collider这一项)
其实到这里我们已经可以得出结论了,下面的情况就不一一列举了
   结论:
    1、和碰撞不同,触发无论谁碰谁,结果都一样;
    2、触发的必要条件:至少有一个碰撞器勾选了IsTrigger,至少有一个物体具有刚体,才会触发;
    3 碰撞和触发的联系和区别以及何时使用它们
         通过以上实验,相信对于碰撞和触发的区别有了一个大致的了解了。
         那么什么时候用碰撞,什么时候用触发呢?
         由于碰撞是可以发生物理效果的同时触发事件,而触发是不发生物理效果的情况下触发事件;
         所以,还是具体情况具体对待,知道了原理就灵活运用吧。

举个例子来说吧。
足球射到墙上会发生碰撞,而足球出界了并不会发生碰撞,而是裁判吹哨这个事件被触发。
那么你就可以在墙上加一个碰撞体不勾选IsTrigger,而出界线加一个Collider并勾上IsTrigger。

四,碰撞和检测的相关的注意点
   两个注意
     注意1
     两个物体发生碰撞,如果要检测到碰撞信息,那么其中必有一个物体既带有碰撞器,又带有刚体,且检测碰撞信息的脚本必须附着在带有刚体的碰撞器上。

     注意2
     两个GameObject发生碰撞,要想检测到触发信息,最少要有一个刚体碰撞器并且勾选了IsTrigger复选框,另一个最少要有一个碰撞器组件,此时检测碰撞的脚本必须附加在那个带有刚体的触发器上。


Unity提供了多种方式进行碰撞检测。以下是一些常用的方法: 1. 物理系统:Unity物理引擎可以自动处理物体之间的碰撞。你可以给物体添加刚体组件,并在刚体上添加碰撞器组件(如BoxCollider、SphereCollider等),然后使用物理材质来调整碰撞的行为。通过使用物理系统,你可以使用触发器(Trigger)和非触发器(Collider)来检测碰撞,并且可以处理碰撞的冲击力和反弹等效果。 2. 触发器(Trigger):你可以将一个Collider组件设置为触发器,当其他物体进入或离开该触发器时,会触发碰撞事件。你可以通过为触发器所在的脚本添加OnTriggerEnter、OnTriggerExit等函数来处理相关逻辑。 3. 非触发器(Collider):非触发器碰撞器可以用于模拟实体之间的物理交互,比如阻挡、推动等。你可以为非触发器碰撞器添加刚体组件使其具有物理属性,或者通过代码来检测碰撞事件。你可以在脚本中使用OnCollisionEnter、OnCollisionExit等函数来处理碰撞逻辑。 4. 射线检测(Raycast):射线检测是一种基于物理原理的碰撞检测方法。你可以通过从一个点发射一条射线,然后检测射线是否与其他物体相交来判断是否发生碰撞Unity提供了Raycast函数来进行射线检测,你可以在脚本中使用该函数来处理碰撞逻辑。 以上是一些常见的碰撞检测方法,在具体场景中可以根据需求选择合适的方法来实现碰撞检测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值