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)的调用情境的更多相关文章

  1. Unity碰撞器触发关系测试

    本文刚体有关的内容不再赘述,主要测试碰撞器和触发器的消息关系. 刚体在这篇有测试:U3D刚体测试1-刚体非刚体物体非Kinematic等之间的碰撞关系 碰撞器测试结果: 1.A对象为Collider, ...

  2. Unity 游戏框架搭建 (五) 简易消息机制

    什么是消息机制? 23333333,让我先笑一会. 为什么用消息机制?   三个字,解!!!!耦!!!!合!!!!. 我的框架中的消息机制用例: 1.接收者 ``` using UnityEngine ...

  3. C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单

    成为开发者 string[] ArrTmp = { "token", Request["timestamp"], Request["nonce&quo ...

  4. (转)C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单

    原文地址:http://www.cnblogs.com/qidian10/p/3492751.html 成为开发者 string[] ArrTmp = { "token", Req ...

  5. springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发

    工作中有这样一个需示,我们把项目中用到代码缓存到前端浏览器IndexedDB里面,当系统管理员在后台对代码进行变动操作时我们要更新前端缓存中的代码怎么做开始用想用版本方式来处理,但这样的话每次使用代码 ...

  6. 【Unity入门】碰撞检测与触发检测

    版权声明:本文为博主原创文章,转载请注明出处. 在Unity里面,游戏物体的碰撞我们可以通过刚体组件(Rigidbody)和碰撞器组件(Collider)来进行检测.首先在场景里面添加一个Plane面 ...

  7. “一切都是消息”--iMSF(即时消息服务框架)入门简介

    “一切都是消息”--这是iMSF(即时消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately) ...

  8. =WM_VSCROLL(消息反射) 和 WM_VSCROLL(消息响应)的区别(控件拥有者自己不处这个理消息,而是反射给控件对象本身来处理这个消息)

    =WM_VSCROLL(消息反射) 和 WM_VSCROLL(消息响应)的区别 所谓消息反射就是控件拥有者自己不处这个理消息,而是反射给控件对象本身来处理这个消息 1.“=WM_VSCROLL”是消息 ...

  9. SpringCloud(六) - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)

    1.安装erlang语言环境 1.1 创建 erlang安装目录 mkdir erlang 1.2 上传解压压缩包 上传到: /root/ 解压缩# tar -zxvf otp_src_22.0.ta ...

随机推荐

  1. Redis服务之常用配置(三)

    上一篇博客我们聊了下redis的rdb持久化.安全连接.资源限制相关配置;回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/13394411.html;今天我们来 ...

  2. easyui 属性 事件 方法

    在easyui当中 属性和事件可以按照json定义的对象来使用. /*在easyui中 属性和事件的使用方法相同*/ var loginWinJson = { closed: false, closa ...

  3. 基于视频压缩的实时监控系统-sprint2采集端图像采集子系统设计

    (1).初始化:a.初始化摄像头:b.注册事件到epoll (2).开始采集--->触发事件处理系统 (3).保存图像(方便测试) a.初始化摄像头 //初始化摄像头 1.获取驱动信息 2.设置 ...

  4. linux学习笔记之makefile

    首先 make时工程管理器 而makefile则是make唯一的配置文件,当我们需要使用make管理工程时,我们需要建立一个makefile文件 简单点说,makefile是把我们所要编译的c文件结合 ...

  5. 前端面试 vue 部分 (5)——VUE组件之间通信的方式有哪些

    VUE组件之间通信的方式有哪些(SSS) 常见使用场景可以分为三类: 父子通信: null 父向子传递数据是通过 props ,子向父是通过 $emit / $on $emit / $bus Vuex ...

  6. MySQL数据的增删改查查查查查查查查查查查查查查查查(查是真的多)

    一 数据的增加 主要是运用insert  into 语句. 格式: insert  into 表名称 values(数据,数据,数据)(要按顺序来,有没有数据的可以加null) 只增加某些字段里数据的 ...

  7. 高级搜索树-AVL树

    目录 平衡因子 AVL树节点和AVL树的定义 失衡调整 插入和删除操作 完整源码 AVL树是平衡二叉搜索树中的一种,在渐进意义下,AVL树可以将高度始终控制在O(log n) 以内,以保证每次查找.插 ...

  8. C#设计模式之18-备忘录模式

    备忘录模式(Memento Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/421 访问. 备忘录模式属 ...

  9. vue.js中 v-for,v-on,v-model,结合应用案例---记事本

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Elasticsearch+SpringBoot报NoNodeAvailableException解决方案

    Elasticsearch整合SpringBoot 首先大家在整合的时候一定要注意版本兼容问题,此问题尤为重要 Elasticsearch简称Es 在使用SpringBoot整合Elasticsear ...