Unity碰撞消息(OnCollisionXXXX)和触发消息(OnTriggerXXXX)的调用情境
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在不同组合情景下打印碰撞和触发消息,并观察物体穿越情况
实验结果如下:

绿色字体表示:物体A在仅有Collider组件的情况下,使用transfrom.Translate方法位移运动,在某个数值范围内可以发生碰撞和触发消息,而超出这个范围外(速度过慢或过快)都不会发生。
另外在对物体穿越情况做测试时发现,不论是位移运动,还是受力运动,一旦物体运动的速度大于某个临界值时,即使双方都有碰撞体+刚体组件,也都会发生穿越情况。
最后总结下。
发生碰撞消息(OnCollisionXXXX)的情况如下两种:
一个物体:碰撞体+刚体,另一个物体:碰撞体,两个物体都不要勾选IsTrigger。此时最好用带有刚体的物体为运动体,仅带有碰撞体的物体为静态体(避免绿色字体情况发生)。
两个物体均为碰撞体+刚体,两个碰撞体都不要勾选IsTrigger。
发生触发消息(OnTriggerXXXX)的情况如下两种:
一个物体:碰撞体+刚体,另一个物体:碰撞体,两个物体中至少有一个碰撞体勾选IsTrigger。此时最好用带有刚体的物体为运动体,仅带有碰撞体的物体为静态体(避免绿色字体情况发生)。
两个物体均为碰撞体+刚体,两个物体中至少有一个碰撞体勾选IsTrigger。
结论一》触发消息和碰撞消息的前置条件基本相似,只要某个碰撞体勾选了IsTrigger属性,与其发生的所有碰撞都将变为触发。
结论二》碰撞体勾选IsTrigger后,该物体将会与其他物体发生穿越,该方法比较适合用于做一些区域检测传递消息等
结论三》消息的传递都是双向的,两个物体发生碰撞,则两个物体都会获得碰撞消息;两个物体发生触发,则两个物体都会获得触发消息。因此在涉及到多个刚体碰撞体运动的时候,设计一个优雅的类可以在很大程度上避免混乱的逻辑和重复的代码。
补充另外一点。
游戏中主角(玩家、敌人等)如果是人物角色,使用角色控制器。如果是汽车或者飞机之类的,则需要添加刚体,对刚体的运动最好使用rigidbody操作,避免发生某些消息无法传递的情况。
Unity碰撞消息(OnCollisionXXXX)和触发消息(OnTriggerXXXX)的调用情境的更多相关文章
- Unity碰撞器触发关系测试
本文刚体有关的内容不再赘述,主要测试碰撞器和触发器的消息关系. 刚体在这篇有测试:U3D刚体测试1-刚体非刚体物体非Kinematic等之间的碰撞关系 碰撞器测试结果: 1.A对象为Collider, ...
- Unity 游戏框架搭建 (五) 简易消息机制
什么是消息机制? 23333333,让我先笑一会. 为什么用消息机制? 三个字,解!!!!耦!!!!合!!!!. 我的框架中的消息机制用例: 1.接收者 ``` using UnityEngine ...
- C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单
成为开发者 string[] ArrTmp = { "token", Request["timestamp"], Request["nonce&quo ...
- (转)C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单
原文地址:http://www.cnblogs.com/qidian10/p/3492751.html 成为开发者 string[] ArrTmp = { "token", Req ...
- springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发
工作中有这样一个需示,我们把项目中用到代码缓存到前端浏览器IndexedDB里面,当系统管理员在后台对代码进行变动操作时我们要更新前端缓存中的代码怎么做开始用想用版本方式来处理,但这样的话每次使用代码 ...
- 【Unity入门】碰撞检测与触发检测
版权声明:本文为博主原创文章,转载请注明出处. 在Unity里面,游戏物体的碰撞我们可以通过刚体组件(Rigidbody)和碰撞器组件(Collider)来进行检测.首先在场景里面添加一个Plane面 ...
- “一切都是消息”--iMSF(即时消息服务框架)入门简介
“一切都是消息”--这是iMSF(即时消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately) ...
- =WM_VSCROLL(消息反射) 和 WM_VSCROLL(消息响应)的区别(控件拥有者自己不处这个理消息,而是反射给控件对象本身来处理这个消息)
=WM_VSCROLL(消息反射) 和 WM_VSCROLL(消息响应)的区别 所谓消息反射就是控件拥有者自己不处这个理消息,而是反射给控件对象本身来处理这个消息 1.“=WM_VSCROLL”是消息 ...
- SpringCloud(六) - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)
1.安装erlang语言环境 1.1 创建 erlang安装目录 mkdir erlang 1.2 上传解压压缩包 上传到: /root/ 解压缩# tar -zxvf otp_src_22.0.ta ...
随机推荐
- Mybatis 的连接池技术
我们在前面的 WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自 己的连接池技术.在 Mybatis 的 SqlMapConfig.xml 配置文件中,通 ...
- Serverless无服务器架构详解
本文对Serverless架构的基础概念.具体产品.应用场景.工作原理进行详细解析. 基础概念 Serverless: 无服务器架构,即在无需管理服务器等底层资源的情况下完成应用的开发和运行,是云原生 ...
- Docker 快速搭建 LDAP
Docker 快速搭建 LDAP 步骤 # 拉取镜像 docker pull osixia/openldap:1.3.0 # 创建并进入映射目录 mkdir -p /usr/local/ldap &a ...
- Navicat Premium 安装破解
软件官网 : https://www.navicat.com.cn/ Navicat Premium 12 下载地址:https://www.lanzous.com/i9j0syf 密码:7pup N ...
- SpringBoot_MyBatisPlus快速入门小例子
快速入门 创建一个表 我这里随便创建了一个air空气表 idea连接Mysql数据库 点击右侧database再点击添加数据库 找到Mysql 添加用户名,密码,数据库最后点击测试 测试成功后在右侧就 ...
- 洛谷 P4198 楼房重建
思路 此题可转化为以下模型 给定序列\(a[1...n]\),支持单点修改,每次求区间单调栈大小 \(n,Q\le 10^5\) 区间单调栈是什么呢?对于一个区间,建立一个栈,首先将第一个元素入栈,从 ...
- MySQL数据库安装,MySQL数据库库的增删改查,表的增删改查,表数据的基本数据类型
一 MySQL的安装 MySQL现在属于甲骨文公司,所以和java语言匹配度较高,同时甲骨文公司的另一种数据库为Oracle,两者同为关系型数据库,即采用关系模型来组织数据,以行和列的方法来存储数据的 ...
- C#LeetCode刷题之#641-设计循环双端队列(Design Circular Deque)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4132 访问. 设计实现双端队列. 你的实现需要支持以下操作: M ...
- C#LeetCode刷题之#704-二分查找(Binary Search)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3999 访问. 给定一个 n 个元素有序的(升序)整型数组 num ...
- C#LeetCode刷题之#849-到最近的人的最大距离(Maximize Distance to Closest Person)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3754 访问. 在一排座位( seats)中,1 代表有人坐在座位 ...