unity settrigger为什么不勾选istrigger也能触发

努力加载中,稍等...
暂无新消息
努力加载中,稍等...
已无更多消息...
这些人最近关注了你
努力加载中,稍等...
已无更多消息
努力加载中,稍等...
已无更多消息
Unity3D碰撞检测中碰撞器与触发器的区别分析
版权所有,禁止匿名转载;禁止商业使用;禁止个人使用。
  游戏游戏开发人员对碰撞检测中碰撞器与触发器这两者不是很能准确区分,为了帮助大家,下面就给大家介绍下这两者的区别和使用场景,一起来看看吧。    要产生碰撞必须为游戏对象添加刚体(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)
当逗留碰撞器    两个物体相接触时到底执行OnTriggerEnter还是执行OnCollisionEnter方法,这两个又有什么区别呢?    为了验证碰撞器与触发器的区别,现设计一个简单的游戏,让小汽车与小球发生碰撞。新建一个C#脚本文件,把它拖给小汽车对象,双击该脚本文件进入脚本编辑器,在该脚本中加入如下两个方法,并分别设置一个断点:12345678 void OnTriggerEnter(Collider collider){
}void OnCollisionEnter(Collision collision) {
}     当未勾选碰撞器的Is Trigger选项时汽车与球体发生碰撞,进入方法OnCollisionEnter,碰撞之后汽车产生被球体撞飞的效果:    如果将碰撞器的Is Trigger属性选中,再次启动游戏让球体与汽车产生接触,这时进入方法OnTriggerEnter。之后球体直接穿过汽车,但球体与汽车都没有产生碰撞效果:    碰撞器和触发器的区别分析    碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性    当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;    当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。    如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器    例子:    碰撞器:汽车被撞飞、皮球掉在地上又弹起效果    触发器:人站在靠近门的位置门自动打开效果
分类:(原创)Unity3D圈
登录后参与讨论。点击
请勿发表无意义的内容请勿发表重复内容请勿发表交易类内容禁止发表广告宣传贴请使用文明用语其它
淫秽色情政治倾向人身攻击抄袭剽窃广告刷屏恶意挖坟冒充他人其它40068人阅读
Unity3D(23)
刚体(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),没有触发事件。
(碰撞体,开启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事件把门预先打开。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:247924次
积分:2160
积分:2160
排名:第14744名
原创:22篇
转载:34篇
评论:21条
(2)(11)(19)(8)(6)(2)(8)Unity3D(10)
我们在游戏里经常会看到,某两个物体发生碰撞之后总会出现一些相应的反应,例如一颗子弹发射后,如果射中目标,目标就消失。而这些反应都是有程序员敲代码敲出来的,那么我们在Unity3D里要怎么实现这些功能呢,很简单,Unity3D为我们提供了很多方便的碰撞触发事件。
&Collider.OnTriggerEnter 进入触发器
& & & & &当碰撞器other进入触发器时OnTriggerEnter被调用。
& & & & &这个消息是发送给触动触发器的碰撞器和刚体(或如果没有刚体的碰撞器)。
&注意:假如一个碰撞物体同时带有一个刚体属性那么只发送这个触发事件。需要勾选isTrigger
Collider.OnCollisionEnter 进入碰撞
& & & & 当collider/rigidbody开始触动另一个rigidbody/collider时OnCollisionEnter被调用.
& & & & 相比OnTriggerEnter,OnCollisionEnter传递Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息。
& & & & 在这个函数如果你不使用collisionInfo,删去collisionInfo参数以避免不必要的计算。
& & & & 注意:如果碰撞器附加一个非动力学刚体,也仅发送碰撞事件。
& 注意:点了isTrigger相当于Collider没用了,rigidbody是基于boxCollider的,没碰撞自然就穿过去了 &,使用OnCollisionEnter时物体不能勾选isTrigger,然而OnTriggerEnter需要勾选
Collider.OnCollisionExit 退出碰撞
& & &* 当 collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用
& & &* 相比OnTriggerExit,OnCollisionExit传递Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息。
& & &* 在这个函数如果你不使用collisionInfo,删去collisionInfo参数以避免不必要的计算。注意,如果碰撞器附加一个非动力学刚体,也仅发送碰撞事件。
注意:isTrigger不能勾选
这里列出的只有Collider对于的触发器,当然还有MonoBehaviour里面的成员,名字都跟Collider一样,这里也不一个一个列举了,具体请看脚本文档.
好了介绍了这些,当然是要来使用的,那我们来看看怎么使用。
我们在我们Game中创建一些物体我们把他们当做敌人Cube,接着再创建一个shape当做玩家。当然也可以用别的来代替,博主只是图个方便- _-!!.如图
接着我们开始写脚本,这里用c#写,当然也可以用js来写,都一样的。
代码也很简单,这里做的效果是,当玩家靠进敌人时敌人就会消失。
void OnTriggerEnter(Collider other)
Destroy(other.gameObject);
}里面的参数就是获得碰撞物的结构。
现在将脚本拖到玩家上,然后运行你就会发现,当与敌人碰撞时,敌人叫消失了。
注意:这个地方的is Trigger要勾上。否则就不会触发OntriggerEnter.
我们接下来试试OnCollisionEnter函数
void OnCollisionEnter(Collision collision)
{&span style=&font-family: Arial, Helvetica, sans-&& &/span&&span style=&font-family: Arial, Helvetica, sans-&&&span style=&white-space:pre&& &/span&Destroy(&/span&&span style=&font-family: Arial, Helvetica, sans-&&collision&/span&&span style=&font-family: Arial, Helvetica, sans-&&.gameObject);&/span&&span style=&font-family: Arial, Helvetica, sans-&&}&/span&
这个和上面的那个效果是一样的,只不过is Trigger不能勾选。
然后OnCollisionExit与OnCollisionEnter相反,当物体碰撞后,然后离开就会触发。这里就不再列出代码了。
玩家移动代码
void Update () {
if (Input.GetKey(KeyCode.W))
transform.Translate(new Vector3(0, 0, -0.4f));
if (Input.GetKey(KeyCode.S))
transform.Translate(new Vector3(0, 0, 0.4f));
if (Input.GetKey(KeyCode.A))
transform.Translate(new Vector3(-0.4f, 0, 0.0f));
if (Input.GetKey(KeyCode.D))
transform.Translate(new Vector3(0.4f, 0, 0.0f));
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12717次
排名:千里之外
原创:32篇
(1)(4)(1)(1)(5)(12)(13)unity不使用刚体的碰撞检测
目的: 这篇文章的主要目的是为了让您了解有关于在Unity内如何使用没有刚体的碰撞检测。
在这里,检查的只是垂直运动方向,但可以通过修改脚本,将对象添加到场景检查其他方向 (或更改cube 的位置。
unity就是 3D 的
11:10&&&[]
不同,但都必须加到GameObjecet身上。 (二)所谓触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。 (三)在Unity3d中,主要有以下接口函数来处理这两种碰撞检测:
触发信息检测: 1.MonoBehaviour.OnTriggerEnter( Collider
17:20&&&[]
在游戏中无时不刻不存在着碰撞, 子弹的飞行,格斗中角色的碰撞带来的打击感,等等。在Unity3d中其拥有强大的物理引擎,提供了刚体,碰撞器等组建。因此也就提供了碰撞检测的相关方法,这里介绍两种碰撞检测的方法:&
1.Collision检测:使用Collision检测有三种
20:12&&&[]
目前来说有三种思路,其实前两种算变种了: 1、动画关键帧回调 + 范围检测。 这个是在Asset store上面下的一个例子中看到的,其实之前在做端游时,也差不多是这样做的,就是挥武器的动作到某一帧的时候,计算武器位中心的范围内有木有怪物,有的话,就给这个目标添加伤害。范围检测用到的函数是这个
21:21&&&[]
用 canvas 做小游戏或者特效,碰撞检测是少不了的。本文将会涉及普通的碰撞检测,以及像素级的碰撞检测。(本文的碰撞检测均以 矩形 为例)
普通碰撞检测 普通的矩形碰撞检测比较简单。即已知两个矩形的各顶点坐标,判断是否相交,如相交,则为碰撞。
leetcode 有道题是给出两个矩形的坐标
09:11&&&[]
&&&&&最近在MFC的OpenGL环境中做拖动家具模型;要用到碰撞检测效果,有哪位大神可以指点下,不甚感激!
回复讨论(解决方案)
你是找现成的库,还是准备自己写?
&&&有现成的就更好,自己写不出来
-15:42&&&[]
。其他的刚体采用离散碰撞模式。此模式适用于那些需要与采用连续动态碰撞检测的对象相碰撞的对象:这对物理性能会有很大的影晌 ,如果不需要对快速运动的对象进行碰撞检测,就使用离散碰撞检测模式。 Continuous Dynamic连续动态碰撞检测模式 该模式用于检测与采用连续 碰 撞 模 式 或 连 续 动
22:04&&&[]
当做触发器的Collider检测,可以通过&
private void OnTriggerStay(Collider collider);
private void OnTriggerEnter(Collider collider);
private void
18:13&&&[]
物体每帧下落10个像素点,系统每帧进行碰撞检测,那么物体落地时会产生3种结果:
1.刚好落在地面上&
2.在地面上几像素处
3.在地面下几像素处
如何时物体每次都刚好落在地面上?
我现在的办法就是让物体的高度每次都是10的整数倍,如果不是,就会出现2,3的情况
10:01&&&[]
(x1+x2)/2,或Y之差大于(y1+y2)/2,则无碰撞。
否则&碰撞。
这里的matrix1,matrix2都是有旋转的
宽x1,x2,高y1,y2
中心点的X之差大于(x1+x2)/2,或Y之差大于(y1+y2)/2,则无碰撞。
否则&碰撞。
19:55&&&[]
&和&其他建筑物是不是分开做碰撞检测?就是地形用高度图,建筑物用aabb(边界盒)之类的做检测?
&&然后我再用个人的见解讨论一下cs中的检测,对不对请大家来指出:cs中的所有物体被组织在了一个bsp文件中,然后载入的时候再把它组织成二叉树(没有使用高度图),进行
19:43&&&[]
问题就是这样,在百度上面搜索出来的又是画图有的三维的。。。。麻烦,各位,又没有什么好一点的方法啊?或自己对于碰撞的想法,参考参考....比如说“坦克大战”里面的碰撞问题
回复讨论(解决方案)
xna&里的碰撞体&基本上就是自己写。
2维环境下&看一个物体是否触
-16:14&&&[]

我要回帖

更多关于 unity3d eventtrigger 的文章

 

随机推荐