A、基本概念 

 要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。

物体发生碰撞的必要条件:
  两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。
 
在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。
 
碰撞器:一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。
 
触发信息检测:
  1.MonoBehaviour.OnTriggerEnter(Collider collider)当进入触发器
  2.MonoBehaviour.OnTriggerExit(Collider collider)当退出触发器
  3.MonoBehaviour.OnTriggerStay(Collider collider)当逗留触发器
 
碰撞信息检测:
  1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器
  2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器
  3.MonoBehaviour.OnCollisionStay(Collision collision)  当逗留碰撞器
 
B、何时触发?

下面就是我做的测试情况,都是A物体去撞B物体。

一、A(碰撞体),B(没有碰撞体,无论有没有刚体),没有触发事件。

二、A(碰撞体),B(碰撞体),没有触发事件。

二、A(碰撞体和刚体,开启IsTrigger),B(碰撞体,关闭IsTrigger),双方都能收到触发事件。

三、A(碰撞体和刚体,关闭IsTrigger),B(碰撞体,开启IsTrigger),双方都能收到触发事件。

四、A (碰撞体,关闭IsTrigger),B(碰撞体和刚体,开启IsTrigger),没有触发事件。

五、A (碰撞体,开启IsTrigger),B(碰撞体和刚体,关闭IsTrigger),没有触发事件。

额外实验:

六、A(碰撞体和刚体,开启IsTrigger)自由下落,B(碰撞体)撞击A,双方都能收到触发事件。

根据上面的实验得出,如果要收到触发事件,必须满足如下三个条件:

1、必须都要有碰撞器组件(Collider),其实上面的碰撞事件同样也需要这个前提条件。

2、必须有一个物体带刚体组件,并且处于运动状体中(包括主动运动去撞击别人和在运动过程中被别人撞击)。

3、两个碰撞器中至少有一个开启了IsTrigger。

此外还有两点:

一、产生触发事件的两个物体会相互穿越,准确的说是因为开启IsTrigger那个物体会被物理引擎锁忽略掉,所以会产生两个物体穿越的情况。

二、两个对象要么都收到碰撞事件,要么都收到触发事件,不会出现一个收到触发事件,一个收到碰撞事件的情况。

还有一个经验点就是,在控制一个物体A去撞另一个物体B时,不要直接去修改物体A的Transform的position属性,因为你会发现如果即使两者发生了碰撞也还是会穿越的,原因就在于我们是直接设置的坐标,如果物体A有刚体组件的话,应该用AddForce,给物体添加一个力,然后让物理引擎去让物体动,此时如果发生了碰撞的话,就不会穿越了。

碰撞的效果:

移动的刚体碰撞器VS静止的静态碰撞器

有碰撞效果,具体为:对于移动的刚体碰撞器在遇到静态碰撞器后会产生物理效果,如反弹、无法前进等;对于静止的静态碰撞器,会产生轻微的碰撞效果,如轻微的晃动,但是不会移动。
 
 

移动的刚体碰撞器VS静止的刚体碰撞器

有碰撞效果,对于两个物体都出现正常的物理效果,如反弹等。
 
 

移动的静态碰撞器VS静止的运动学刚体碰撞器

没有任何碰撞效果。运动学刚体碰撞器是不受到任何外力作用的。
 
 

移动的运动学刚体碰撞器VS静止的静态碰撞器

没有任何碰撞效果。运动学刚体碰撞器是不受到任何外力作用的。
 
 

移动的运动学刚体碰撞器VS静止的刚体碰撞器

有碰撞效果,但仅刚体碰撞器有碰撞效果,如反弹等,运动学刚体碰撞器不受力的作用。
 
 

移动的刚体碰撞器VS静止的运动学刚体碰撞器

有碰撞效果,但仅刚体碰撞器有碰撞效果,如反弹等,运动学刚体碰撞器就像一堵墙一样一动不动。
 
 

移动的运动学刚体碰撞器VS静止的运动学刚体碰撞器

两个太上皇相见了会怎么样呢?没有任何反应……就像两个静态碰撞器一样。

碰撞信息和触发信息

 
对于碰撞时是否会发出碰撞函数(或触发信息),可以见下表。碰撞信息是指OnCollisionEnter() OnCollisionStay()和 OnCollisionExit()这三个函数,而触发信息指的是OnTriggerEnter() OnTriggerStay和OnTriggerExit()三个函数。
 
 
 
 
Collision detection occurs and messages are sent upon collision
碰撞后有碰撞检测并有碰撞信息发出
  Static Collider
静态碰撞器
Rigidbody Collider
刚体碰撞器
Kinematic 
Rigidbody Collider
运动学刚体碰撞器
Static 
Trigger Collider
静态触发碰撞器
Rigidbody 
Trigger Collider
刚体触发碰撞器
Kinematic Rigidbody 
Trigger Collider
运动学刚体触发碰撞器
Static Collider 静态碰撞器   Y        
Rigidbody Collider 刚体碰撞器 Y Y Y      
Kinematic Rigidbody Collider 
运动学刚体碰撞器
  Y        
Static Trigger Collider
静态触发碰撞器
           
Rigidbody Trigger Collider
刚体触发碰撞器
           
Kinematic Rigidbody Trigger Collider
运动学刚体触发碰撞器
           
Trigger messages are sent upon collision
碰撞后有触发信息
  Static Collider
静态碰撞器
Rigidbody Collider
刚体碰撞器
Kinematic 
Rigidbody Collider
运动学刚体碰撞器
Static 
Trigger Collider
静态触发碰撞器
Rigidbody 
Trigger Collider
刚体触发碰撞器
Kinematic Rigidbody 
Trigger Collider
运动学刚体触发碰撞器
Static Collider 静态碰撞器         Y Y
Rigidbody Collider 刚体碰撞器       Y Y Y
Kinematic Rigidbody Collider
运动学刚体碰撞器
      Y Y Y
Static Trigger Collider 静态触发碰撞器   Y Y   Y Y
Rigidbody Trigger Collider
刚体触发碰撞器
Y Y Y Y Y Y
Kinematic Rigidbody Trigger Collider
运动学刚体触发碰撞器
Y Y Y Y Y Y

unity3d的碰撞检测及trigger的更多相关文章

  1. unity3d立方体碰撞检测(c#代码实现)

    由于unity自带的碰撞组件特别耗费性能,网上的unity物体碰撞的c#代码实现比较少,没有适合的,只能自己写一个来用: using System; using System.Collections. ...

  2. [Unity菜鸟] 笔记2 —— 问题篇

    记录在学习<Unity 3.x 游戏开发 经典教材>时遇到的各种问题与笔记 1. 初始不能降低Terrain的高度,需要到Terrain设置的第二个按钮中将Height从0调高 (注意:最 ...

  3. Unity项目 - 坦克大战3D TankBattle

    目录 游戏原型 项目演示 绘图资源 代码实现 技术探讨 参考来源 游戏原型 游戏玩法:在有界的战场上,玩家将驾驶坦克,代表绿色阵营,与你的队友一起击溃红蓝阵营的敌人,在这场三方大战中夺得胜利! 操作指 ...

  4. [Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放

    貌似有一段时间没更新2dtoolkit系列了,这段时间一直在忙着其他事情,今天开始继续这个插件系列的教程,网上搜索,貌似关于这个插件的教程无非还是跟官方的教程很类似,有的甚至都没有自己照着亲手实践一遍 ...

  5. unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)

      刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...

  6. Unity3d碰撞检测中碰撞器与触发器的区别

    要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动.碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一起,除非两个对 ...

  7. Unity3D实践系列09, 物理引擎与碰撞检测

    在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody.Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测.Collider组件中的"Is T ...

  8. (转)Unity3d中的碰撞检测

    很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自 ...

  9. 【Unity3D】刚体与碰撞体以及is Trigger属性的意义

    [Unity3D]刚体与碰撞体以及is Trigger属性的意义 刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚 ...

随机推荐

  1. 这是一个专注于电脑技术、软件应用、互联网、嵌入式,电子技术行业等的原创IT博客

    http://www.choovin.com/ 这是一个专注于电脑技术.软件应用.互联网.嵌入式,电子技术行业等的原创IT博客

  2. Appium 使用小结

    前言: Appium 是通过模拟用户操作进行自动化操控手机端第三方库.通常使用场景多用于回归测试.在产品教成熟,页面改动较少后,通过ui自动化进行回归操作测试. Appium 本身使用很简单,java ...

  3. python3:cmd运行python脚本,提示 No module named 'xxx'

    问题:cmd窗口运行python脚本,报错 C:\Users\xxx\Documents\GitHub\python3\main>python run_test.pyTraceback (mos ...

  4. CS231n 斯坦福深度视觉识别课 学习笔记(完结)

    课程地址 第1章 CS231n课程介绍 ---1.1 计算机视觉概述 这门课的主要内容是计算机视觉.它是一门需要涉及很多其他科目知识的学科. 视觉数据占据了互联网的绝大多数,但是它们很难利用. --- ...

  5. 2.1 Linux中wait、system 分析

    wait与waitpid: 当子进程退出的时候,内核会向父进程发送SIGCHID信号,子进程的退出是一个异步事件(子进程可以在父进程运行的任何时刻终止). 子进程退出时,内核将子进程置为僵尸状态,这个 ...

  6. 【计算机视觉】交并比IOU概念理解

    前言 交并比IOU(Intersection over Union)是一种测量在特定数据集中检测相应物体准确度的一个标准. 图示 很简单,IoU相当于两个区域重叠的部分除以两个区域的集合部分得出的结果 ...

  7. 不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 Lazy 中导致死锁

    WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型.其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程. 然而,如果你在 Lazy 上下文中使用了 ...

  8. CTF-练习平台-WEB之 计算题

    四.计算题 打开连接 输入后发现只能输入一个数字,在火狐浏览器中按F12,打开查看器 ,如图所示修改最大长度 输入答案后验证,当当当~~flag出现

  9. set 与 map 的第一次尝试

    map 杭电6015http://acm.hdu.edu.cn/showproblem.php?pid=6015 基本用法:map<string,int>mp;   mp[class[ i ...

  10. cglib 简单 代理示例-1

    引用包cglib-xxx.jar非Maven项目还需要手动引用包asm-xxx.jar业务类(不需要定义接口)cglib代理类(实现接口MethodInterceptor) 异常信息(项目只引用了cg ...