unity3d中的trigger和collision消息以及刚体与碰撞体

一直困惑于unity3d中的触发和碰撞消息在什么条件下能够发生,平时用时也是一知半解。磨刀不误砍柴工,是时候发点时间一劳永逸的解决这个问题了XD。

OnTriggerEnter, OnTriggerStay, OnTriggerExit 是为触发类消息,记为trigger

OnCollisionEnter, OnCollisionStay, OnCollisionExit是为碰撞类消息, 记为collision

None表示两类消息都没发生

如果对象有刚体(rigidbody)且其 IsKinematic 选项勾选,则记为KT,否则记为KF

如果对象有碰撞体(collider)且其 IsTrigger 选项勾选,则记为TT,否则记为TF

(KT,TT)表示对象有刚体组件且其IsKinematic选项勾选,有碰撞体组件且其IsTrigger选项勾选

(KT,TF)、(KF,TT)、(KF,TF)依此类推

  • 情形一,两个对象都只有刚体组件 :
KF KT
KF None None
KT None None

可以看到没有消息产生

  • 情形二,两个对象都只有碰撞体组件:
TF TT
TF None None
TT None None

可以看到也没有消息产生

  • 情形三,一个对象有刚体组件和碰撞体组件,而另一个对象只有碰撞体组件或只有刚体组件
(TF, KF) (TF,KT) (TT,KF) (TT,KT)
TF collision None trigger trigger
TT trigger trigger trigger trigger
KF None None None None
KT None None None None

可以看到要产生消息需要两个对象都有碰撞体组件并且至少一个对象有刚体组件

  • 情形四,两个对象都有刚体组件和碰撞体组件
(TF, KF) (TF,KT) (TT,KF) (TT,KT)
(TF, KF) collision collision trigger trigger
(TF,KT) collision None trigger trigger
(TT,KF) trigger trigger trigger trigger
(TT,KT) trigger trigger trigger trigger

可以看到

要产生trigger消息:至少有一个碰撞体组件的 IsTigger 选项勾选

要产生collision消息:两个碰撞体组件的 IsTrigger 选项都未勾选且至少有一个刚体组件的 IsKinematic 选项未勾选

结论:

产生消息的基本条件:两个对象都有碰撞体组件并且至少一个对象有刚体组件

要产生trigger类消息:除满足基本条件外,至少有一个碰撞体组件的 IsTigger 选项勾选

要产生collision类消息:除满足基本条件外,两个碰撞体组件的 IsTrigger 选项都未勾选且至少有一个刚体组件的 IsKinematic 选项未勾选

时间: 2024-12-29 11:26:46

unity3d中的trigger和collision消息以及刚体与碰撞体的相关文章

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

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

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

和好的文章,有一些原作者的结论很经典. 刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动.任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件. 个人理解就是刚体是用来模拟物体受到一个力作用

(转)Unity3d中的碰撞检测

很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自己所了解的碰撞检测,希望高手不佞赐教. 首先,我们得明确一点:即产生碰撞信息所需要的条件.事实上,在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器.这两种方式的应用非常广泛.为了完整的了解这两种方式,我们必须理解以下概念:    (一)碰撞器是一群组件,它包含了

Unity3D中可重载虚函数的总结

重载虚函数:Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. Awake 当前控制脚本实例被装载的时候调用.一般用于初始化整个实例使用. Start 当前控制脚本第一次执行Update之前调用. Update 每帧都执行一次.这是最常用的事件函数. FixedUpdate 每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的

Unity3D中的Coroutine详解

Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutine程序执行流程怎么那么奇怪? unity中的coroutine原理是什么,怎么实现的? 使用unity的coroutine需要注意什么问题? 一.yield的在几种语言中的程序执行特性: Lua中的yield是使得协同函数运行->挂起并且传递参数给resume.resume使得协同函数挂起->运行

Unity3D中事件函数的运行顺序

Unity3D中脚本的生命周期是依照预先定义好的事件函数的运行流程来演化的,详细流程例如以下: Editor模式下Reset: 当脚本第一次被挂到GameObject上或用户点击Resetbutton时,Reset被调用初始化脚本属性,最经常使用于在Inspector视图中呈现好的默认值. 载入第一个场景First Scene Load: 场景启动时会对场景中的每一个对象运行一遍例如以下事件函数: Awake:游戏启动之前初始化不论什么变量和游戏状态,仅在脚本生命周期中调用一次.不能做协程,St

Unity3D中使用KiiCloud总结一

Kii Cloud简介 Kii Cloud提供一系列的服务,来帮助你为你的App获取用户,留住用户,以及创造利润.它为移动App提供了用户管理以及快捷安全可扩展的数据存储服务. 现在你可以在短短几分钟内为你的App添加一个后端服务.Kii Cloud通过为你提供一个可扩展的后端服务,来帮助你节省大量的时间和金钱.因为不需要写一行服务端的代码,你不必去招聘(或者变成)一个服务端工程师或者DBA.我们会保证提供安全,可靠以及可扩展的服务,这样你只需要专注于优化你的App,改善用户体验以及在App S

unity3d中的触发或者碰撞函数

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

【转】Unity3D中Layers和LayerMask解析

Unity中是用int32来表示32个Layer层.int32表示二进制一共有32位(0-31).在Unity中可编辑的Layer如下图所示: 在Unity中每个GameObject都有Layer属性,默认的Layer都是Default.在Unity中可编辑的Layer共有24个(8-31层),官方已使用的是0-7层,默认不可编辑! LayerMask实际上是一个位码操作,在Unity3D中一共有32个Layer层,并且不可增加. 位运算符 按位运算符:~.|.&.^.位运算符主要用来对二进制位