来自:http://blog.csdn.net/monzart7an/article/details/22739421

刚体(Rigidbody)的官方(摘自Unity3d的官方指导书《Unity4.x从入门到精通》)解释如下:

Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件。

个人理解就是刚体是用来模拟物体受到一个力作用时候的表现,这个从刚体中的参数就可以看出:

全是关于物体受到力之后,怎么运动的参数,比如Mass质量,Drag阻力。

碰撞体的官方(摘自Unity3d的官方指导书《Unity4.x从入门到精通》)解释如下:

碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。

个人是这样理解的,为什么要判断碰撞,判断碰撞就是需要计算力,无论是阻力也好,动力也好,如果此时物体有刚体组件,那么物体就会在力的作用下运动。如果这个物体没有刚体,那么碰撞产生的力就没有任何意义了,那计算碰撞也就没有任何意义了。

所以,我们可以推断出,如果两个碰撞体都没有刚体组件,那么这两个物体即使相互发生了碰撞,那么也不会有碰撞事件的。

官网上的碰撞的图如下(注:据说是官网的图,我在网上很多地方看到了,但我目前为止还没找到在官网的哪个位置哈):

从上面的图中我们看出来碰撞的双方中一定要有一个Rigidbody存在,并且碰撞双方必须都要有碰撞体组件。

但做实验的时候发现了一个很诡异的事情,就是发生碰撞的主体一定是要带刚体的,即只有带刚体的碰撞体去撞其他碰撞体时,双方才会收到碰撞事件,以下是我做的实验:

一、控制A(刚体加碰撞体)撞击 静止的B(只有碰撞体),双方能收到碰撞事件。

二、控制B(只有碰撞体)撞击 静止的A(刚体加碰撞体),双方收不到碰撞事件。

三、让A(刚体加碰撞体)自由下落,然后控制B(只有碰撞体)去撞击A,双方能受到碰撞事件。

得出的结论似乎是如果碰撞双方只有一个有刚体,那么那个刚体一定要处于运动的状态下才会有碰撞事件发生。

接下来就是IsTrigger选项了,上面的情况都没有触发信息,先列举一下触发事件和碰撞事件,如下:

触发信息检测:
1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器
2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器
3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器

碰撞信息检测:
1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
3.MonoBehaviour.OnCollisionStay( Collision collisionInfo )  当逗留碰撞器

下面是一张关于触发的关系图,如下(注:同样是来自网上,我目前还没在官网上找着哈)

下面就是我做的测试情况,都是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,给物体添加一个力,然后让物理引擎去让物体动,此时如果发生了碰撞的话,就不会穿越了。

好吧,下午折腾了半天之后,我就一直在想那个IsTrigger有啥用,后来在网上搜了一下,说是可以做门的自动打开,就让我想起了Unity3d 4自带的哪个AngryBots例子,貌似当控制主角走到一个门前时,那个门会自动打开。

于是就打开那个例子工程,去看,发现果然是这样的,大概原理就是在门前面放了一个设置了IsTrigger的透明碰撞体,用于专门监听碰撞,当主角进入这个区域时,就通过OnTriggerEnter事件把门预先打开。

如图:

交叉参考:
http://www.jianshu.com/p/d2cd436e2bc0
http://www.jianshu.com/p/f99463f0578d

深入理解Unity刚体(Rigidbody)、碰撞器(Collider)、触发器(Trigger)相关推荐

  1. Unity --- 物理引擎 ---- 刚体RigidBody 与 碰撞器 collider

    1.RigidBody(刚体)的作用是让物体具有物理特性(比如说重力,摩檫力等等) 2.如果想让物体能够与其它物体发生碰撞的话,我们还需要一个组件 --- Colider碰撞器组件 1.上图就是Uni ...

  2. Unity 2.Space Shooter(碰撞器Collider,WebGL,刚体中属性,(定时)实例化、销毁游戏对象,触碰OnTriggerEnter/Exit,爆炸效果,音频,文字,定时调方法)

    目录 项目介绍 WebGL发布 游戏对象设置 灯光.相机 背景 移动游戏对象 Debug 制作子弹 射击动作 清理离开边界的游戏对象 制作危险物 添加爆炸,移动小行星,作为预制件 创建游戏控制器 循环 ...

  3. Unity 碰撞器和触发器的理解

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

  4. unity第三天:物体的碰撞器与触发器

    unity第三天:碰撞器与触发器 前言 一.吃豆球的豆 二.吃豆球 三.又是豆 前言 15:06- 很好, 又是一个下午开始的博客-- Code Start! 一.吃豆球的豆 在新建一个cube,命名 ...

  5. 关于Unity中的刚体和碰撞器的相关用法(一)

    1.创建一个3D工程 2.构造项目文件目录 3.保存场景为game_scene到文件夹scenes中 4.创建一个Plane平面类型的GameObject节点和一个Sphere球体类型的GameObj ...

  6. 第二十五章 Unity 刚体Rigidbody

    在物理学中,静止和匀速直线运动是物体的平衡状态,如果给该物体施加某一个力的话,物体的平衡状态就会改变,当然这个真理的前提是理想状态.我们知道在现实世界中,由于重力和摩擦力的存在,任何一个物体都不可能永 ...

  7. Unity 之刚体,碰撞体,触碰器

    Unity中文官方文档https://docs.unity.cn/cn/current/Manual/class-Rigidbody2D.html Rigidbody 刚体 是赋予物体力的的作用效果的 ...

  8. 详解Unity中的车轮碰撞器Wheel Collider

    前言 碰撞体组件定义了物体的物理性状,Unity中有一系列基本碰撞体,我们可以使用它们组合成任意形状,但除了基本碰撞体之外,Untiy还提供了诸如车轮(Wheel).网格(Mesh).地形(Terra ...

  9. Collider(碰撞器)与IsTrigger(触碰器)详解

    1.什么是碰撞器? 描述了物体可被碰撞的边界,以及碰撞过程中相互影响效果. 碰撞效果: 两个游戏对象碰在一起,通过物理引擎产生类似现实的效果 种类: 盒碰撞器(Box Collider) 椭圆碰撞器( ...

最新文章

  1. iOS 的组件化开发
  2. 宿主如何访问虚拟机中的web服务器
  3. 99% 人看得懂的“熔断”以及最佳实践
  4. qt显示echart_Qt配置,载入html,Echart, 交互
  5. 计算机电脑的特点,计算机的五大特点是什么
  6. atexit函数的执行顺序_Python模块学习:atexit
  7. Django之Apache2部署
  8. 操作系统复习笔记(二)
  9. c++动态联编与静态联编
  10. 网络高清视频远程会议系统EasyRTC在Windows10上运行程序无返回信息问题解决
  11. ps文字工具学习笔记
  12. 相干接收机matlab仿真,基于DP-16QAM的400Gbit/s集成相干接收机关键技术研究
  13. github上很好的iOS资源集锦
  14. 【错误记录】Flutter 编译报错 ( The parameter ‘‘ can‘t have a value of ‘null‘ because of its type, but the im )
  15. 西电操作系统上机实验2
  16. JS里数组合并的几种方法
  17. k均值图像分割的GPU加速
  18. python:继承,重用代码
  19. 3D_systems_touch控制Dobot魔术师
  20. numpy 光速入门示例

热门文章

  1. java date eee_java将 Date原始格式EEE MMM dd HH:mm:ss Z yyyy转成指定格式
  2. python 全局解释器锁_python全局解释器锁(GIL)
  3. web安全的学习路线
  4. python中关于字典的基础运用
  5. 201604-1折点计数
  6. PMC联手云合作伙伴Canonical加入其Ubuntu OpenStack互通性实验室
  7. Shell脚本学习-阶段二
  8. Linux时间子系统之(五):POSIX Clock
  9. [CentOs7]搭建ftp服务器(2)——添加用户
  10. js--小结⑥---typeof