Unity碰撞消息(OnCollisionXXXX)和触发消息(OnTriggerXXXX)的调用情境

摘要:
根据3D和2D对象,存在碰撞:碰撞、碰撞2D。以3D对象为例,进行了以下实验,分别测试了OnColisionXXXX冲突消息和OnTriggerXXXX触发消息的调用场景。有两种碰撞消息:一种对象:碰撞体+刚体,另一种对象是碰撞体。不要检查任一对象的IsTrigger。如果是汽车或飞机,则需要添加刚体。刚体操作最好用于刚体运动,以避免某些信息无法传递的情况。

MonoBehaviour中的消息非常多,一共有62个!

除了必须关注的脚本生命周期的一系列函数外,还有其他两组比较常混淆的消息:碰撞和触发。

按3D和2D物体区分,又分为碰撞:Collision、Collision2D。触发:Trigger、Trigger2D。

以3D物体为例做了如下实验,分别测试下OnColiisionXXXX碰撞消息和OnTriggerXXXX触发消息的调用情景。

实验模拟:

1.分别创建物体A 和 物体B,使物体A处于物体B上方

2.在物体A有刚体组件的情况下,对物体A添加受力运动(rigidbody.AddForce),在物体A没有刚体组件的情况下,对物体A添加位移运动(transform.Translate)。

3.在物体有刚体组件的情况下,均取消刚体的受重力影响选项。

4.分别对物体A和物体B在不同组合情景下打印碰撞和触发消息,并观察物体穿越情况

实验结果如下:

Unity碰撞消息(OnCollisionXXXX)和触发消息(OnTriggerXXXX)的调用情境第1张

绿色字体表示:物体A在仅有Collider组件的情况下,使用transfrom.Translate方法位移运动,在某个数值范围内可以发生碰撞和触发消息,而超出这个范围外(速度过慢或过快)都不会发生。

另外在对物体穿越情况做测试时发现,不论是位移运动,还是受力运动,一旦物体运动的速度大于某个临界值时,即使双方都有碰撞体+刚体组件,也都会发生穿越情况。

最后总结下。

发生碰撞消息(OnCollisionXXXX)的情况如下两种:

一个物体:碰撞体+刚体,另一个物体:碰撞体,两个物体都不要勾选IsTrigger。此时最好用带有刚体的物体为运动体,仅带有碰撞体的物体为静态体(避免绿色字体情况发生)。

两个物体均为碰撞体+刚体,两个碰撞体都不要勾选IsTrigger。

发生触发消息(OnTriggerXXXX)的情况如下两种:

一个物体:碰撞体+刚体,另一个物体:碰撞体,两个物体中至少有一个碰撞体勾选IsTrigger。此时最好用带有刚体的物体为运动体,仅带有碰撞体的物体为静态体(避免绿色字体情况发生)。

两个物体均为碰撞体+刚体,两个物体中至少有一个碰撞体勾选IsTrigger。

结论一》触发消息和碰撞消息的前置条件基本相似,只要某个碰撞体勾选了IsTrigger属性,与其发生的所有碰撞都将变为触发。

结论二》碰撞体勾选IsTrigger后,该物体将会与其他物体发生穿越,该方法比较适合用于做一些区域检测传递消息等

结论三》消息的传递都是双向的,两个物体发生碰撞,则两个物体都会获得碰撞消息;两个物体发生触发,则两个物体都会获得触发消息。因此在涉及到多个刚体碰撞体运动的时候,设计一个优雅的类可以在很大程度上避免混乱的逻辑和重复的代码。

补充另外一点。

游戏中主角(玩家、敌人等)如果是人物角色,使用角色控制器。如果是汽车或者飞机之类的,则需要添加刚体,对刚体的运动最好使用rigidbody操作,避免发生某些消息无法传递的情况。

免责声明:文章转载自《Unity碰撞消息(OnCollisionXXXX)和触发消息(OnTriggerXXXX)的调用情境》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇泛型的优点MQTT的使用介绍下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于ESB(企业服务总线)

一.什么是ESB ESB是Enterprise Service Bus的简称,中文翻译为企业服务总线,企业服务总线是一个实现系统间集成和互联互通的重要技术架构,可以理解为是一种消息和服务集成的中间件平台。 二.ESB解决了什么问题以及什么是HSB ESB主要是为了解决多个应用系统互联所面临的的复杂性,减低集成和维护成本。 举个例子,比如我们的医疗业务系...

【转】国内CPU现状

首页 博客 学院 下载 图文课 论坛 APP CSDNCSDN学院 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 百度APP扫码 关注智能小程序 阅读体验更佳 消息 评论关注点赞回答系统通知 登录注册 我的关注 我的收藏 个人中心 帐号设置 我的博客 管理博客 我的学院 我的...

ASP.NET Core 实现 MQTT通讯协议 Demo(开源库:MQTTnet)

1、什么是MQTT   MQTT(message queuing telemetry transport)是IBM开发的即时通讯协议,是一种发布/订阅极其轻量级的消息传输协议,专门为网络受限设备、低宽带以及高延迟和不可靠的网络而设计的。由于以上轻量级的特点,是实现智能家居的首选传输协议,相比于XMPP,更加轻量级而且占用宽带低。简单来说HQTT是一种通信...

domino控制台命令

Broadcast message 向该服务器的用户广播消息 Broadcast message usernames 向该服务器的某一用户广播消息 Dbcache Flush 关闭当前在数据库高速缓存中打开的所有数据库。使用此命令可以在高速缓存中维护数据库,例如:备份或恢复数据库。 Drop username 关闭一个或多个服务器会话。如果...

手机软件Toast无法显示提示信息

  近日在做项目时,测试组的同事提出一个bug,就是在一台LG手机上,原本应该显示的Toast信息,都不显示,消息栏也没有出现通知,后来经过查资料知道有些三星、LG手机默认禁用了显示通知那一项,而不显示通知时,Toast也显示不出来的。 解决办法:三星、LG手机禁用开启消息的选项,在手机设置-->应用程序管理-->不显示Toast的应用程序,有...

单体架构、SOA、微服务

1、单体架构 2、单体架构的拆分 3、SOA与微服务的区别 4、微服务的优缺点 5、微服务的消息 6、服务集成 7、数据的去中心化 一、单体架构 Web应用程序发展的早期,大部分web工程是将所有的功能模块(service side)打包到一起并放在一个web容器中运行,很多企业的Java应用程序打包为war包。其他语言(Ruby,Python或者C++)...