转载 unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger)

和好的文章,有一些原作者的结论很经典。

刚体(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://blog.csdn.net/monzart7an/article/details/22739421

时间: 09-11

转载 unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger)的相关文章

[原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)

通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长方体,一般可用作门,墙及平台等,也可用于交通工具的外壳.最适合的是使用在盒子和箱子上. Is Trigger:触发器,勾选后可用于触发事件,且将被物理引擎所忽略. Material:材质,采用不同的Physics Material决定了碰撞体与其他对象的交互形式. Center:碰撞体在对象局部坐标

【Unity】第11章 第三人称角色控制器和碰撞体

分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 第三人称视角控制器涉及的相关概念有: 1.刚体(Rigidbody). 2.碰撞体(Collider).包括球体碰撞体(Sphere Collider).箱体碰撞体(Box Collider).网格碰撞体(Mesh Collider).物理材质(Physics Material).铰链关节(Hinge Joint).弹簧关节(Spring Joint)等. Unity内置了 NVIDIA PhysX 物理引擎.要控制

Unity3D之碰撞体,刚体

一 概念介绍 刚体 Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动.任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件. 碰撞体 碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体

u3d中刚体与碰撞体的理解以及is Trigger属性的意义

刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚体与碰撞体的关系:个人理解判断碰撞体就是需要计算力,如果碰撞的物体有刚体组件,那么该物体就会在碰撞体计算出的力的作用下运动.如果这个物体没有刚体,那么碰撞体产生的力就没有了受体,也就没有任何意义了. 碰撞事件产生条件:得出的结论似乎是如果碰撞双方只有一个有刚体,那么那个刚体一定要处于激活状态(什么是激活状态,我需要继续学习)下才会有碰撞事件发生. is Trigg

U3D中碰撞体和刚体的关系

1.刚体是用来接受力作用的组件: 2.碰撞体是碰撞系统用来检测碰撞的组件: 碰撞产生碰撞信息,游戏物体根据碰撞信息生成一个力作用在刚体上,刚体受力后就会产生一个速率,最终在游戏物体的运动体现出来. 也就是说,没有刚体,只有碰撞体,你观察不到碰撞效果: 没有碰撞体,只有刚体,你也观察不到: 就这样分析就OK了:

【Unity】11.3 基本碰撞体(箱体、球形、胶囊、网格)

分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 碰撞组件(Collider) 是另一种必须随刚体 (Rigidbody) 添加的组件,以便允许它和其他组件发生碰撞.或者说,如果仅仅是两个刚体 (Rigidbody) 相互碰撞,则物理引擎不会计算碰撞,除非这两个对象又都附加了碰撞组件 (Collider). 无碰撞组件 (Collider) 的刚体 (Rigidbody) 在物理模拟过程中只会穿过彼此. 二.基本概念 1.添加碰撞体的方法 首先选中一个游戏对象,然后

[Unity3D]使用碰撞体做触发器实现自动开门

在游戏制作中触发器的使用非常的方便也非常实用.这一张我们简单介绍一下如何使用一个简单的触发器来实现自动开门关门的效果. 首先确保你已经对门进行了动画的设置. 具体流程如下. 选择Window->Animation打开动画窗口,选中需要添加动画的门之后点击红色按钮创建新动画. 选中一个需要添加动画的要素之后(比如Postion.x),点击添加关键帧按钮: 拖动时间轴,在动画终点的位置放手: 在场景中拖动那个门到想要停止的位置,创建动画终点的关键帧: 点击Animation面板上的播放键,可以预览一

unity3d中的触发或者碰撞函数

触发函数 void OnTriggerEnter(Collider other)     {        if (other.gameObject.name == "Cube2")         {             Debug.Log("我穿过了"+other.name);         } } //还有 OnTriggerExit(),OnTriggerStay() 注意: Is Trigger 打勾 碰撞函数   void OnCollisionE

为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?

两个Gameobject 放置在空中, 一个是Cube,一个是茄子模型 Cube的Collider 是Box Collider , 茄汁的Collider 是mesh collider, 他们都添加了刚体(RigidBody)组件, 勾选了重力Gravity 但是, 运行的结果是: 正方块Cube下落, 掉到地面上停了下来 茄子下落,没有停下来, 穿透了地面,一直往下掉. 百事不得其解... 终于还是在官方文档中看到这段话: There are some limitations when usi