unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新

2023-11-19

分类: Unity3D 2014-04-01 16:50  2755人阅读  评论(2)  收藏  举报

刚体(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),没有触发事件。

五、A (碰撞体,开启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事件把门预先打开。

如图:


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新 的相关文章

随机推荐

  • 在 IBM Bluemix 开发及使用 Docker Images

    Node Js是云端平台开发App的主要工具 以下范例是将Bluehatter App以3中方式执行包含 1 以Node Js在localhost开发Bluehatter App后直接Deloy至IBM Bluemix云端平台执行 2 将前
  • yolov5量化部署(基于openvino和tensorrt)

    yolov5 openvino量化部署 首先 下载YOLOv5源码 安装YOLOv5和OpenVINO的python依赖 git clone https github com ultralytics yolov5 git pip insta
  • 常用的vue指令语法用法

    一 v text 相当于js的innerText 二 v bind 动态绑定属性 简写是冒号 三 v on 绑定事件 简写是 用于事件的绑定类似于js的onclick 四 v model 可以用 v model 指令在表单
  • 【Python-利用动态二维码传输文件(二)】实现文件二进制读取、利用base64编码把文件拆分成多张二维码、重组拆分后的文件并验证。

    为了使用二维码传输文件 上一篇文章已经实现了获取信息存入二维码并打印 由于单个二维码存储的信息量是有限的 而且文件一般也比较大 所以必须把文件先进行拆分 拆分后一块一块信息存入多张二维码中 最后通过图像识别 把所有二维码信息准确读取后再重新
  • 初级2 题目五 有关排序问题的补充

    1 归并排序的额外空间复杂度可以变成O 1 但是非常难 不需要掌握 可以搜 归并排序 内部缓存法 2 快速排序可以做到稳定性问题 但是非常难 不需要掌握 可以搜 01 stable sort 3 有一道题目 是奇数放在数组左边 偶数放在数组
  • 【老生谈算法】基于matlab指纹识别系统设计与算法原理详解(论文+程序源码)——指纹识别

    老生谈算法 基于matlab指纹识别系统设计与算法原理 论文 程序源码 大家好 今天给大家介绍基于matlab的指纹识别系统设计与算法原理 论文 程序源码 文章目录 老生谈算法 基于matlab指纹识别系统设计与算法原理 论文 程序源码 1
  • 服务器可以放置多少个网站?

    服务器能容纳的网站数量 是根据每个网站的大小 以及服务器的整体配置来确定的 那么影响服务器容纳网站数量的因素有哪些呢 一 网站大小 能影响一个网站大小的因素是比较多的 例如网站的设计 网站里的内容大小 通常网站尺寸比较大 动态页面比较多的
  • QtCreator 应用程序主窗口——菜单栏(QMenuBar)和工具栏(QToolBar)

    1 菜单栏 QMenuBar 和工具栏 QToolBar 1 1 将菜单项放在工具栏上面 将Action编辑器中的相应动作直接拖到工具栏上面 1 2 使用资源 添加资源文件 gt Qt资源文件 gt 添加前缀 gt 添加文件 gt 保存 使
  • JS for循环的3种使用

    1 1 for循环使用 1 for in 遍历存放对象的一维数组 var arr id 1 name 張山 id 2 name 李四 for var i in arr console log i 结果 仅仅会得到数组的索引会遍历数组的原型属
  • ARM接口编程—WDT(exynos 4412平台)

    WDT简介 Watch Dog Timer即看门狗定时器 其主要作用是当发生软件故障时可产生复位信号使SOC复位 其本质是一个计数器 WDT工作原理 WTD寄存器 wtd控制寄存器 用于设置一级分频 二级分频 使能 产生复位和中断信号 WT
  • 【redis】redis的 key的命名规则

    key的命名规则 定义为 MS TEN SESSION KEY IN LOGIN NAME fqh 使用 进行分割 这样存入redis的是有层次结构的 如下
  • Java程序员常常为这个字所困扰!Java

    Java程序员常常为这个字所困扰 Java Java是一种流行的编程语言 广泛应用于开发各种类型的应用程序 然而 有一个字在Java开发中经常让程序员感到困惑和挫败 这个字就是 异常 异常在Java中是一个重要的概念 用于处理程序运行过程中
  • Peewee的坑

    db create tables Student 当如上使用时可能会报表Student不存在的错误 官方实例如db create tables Student Pet 改成db create tables Student safe True
  • .NET概述

    1 NET技术体系结构 NET平台是Microsoft在20世纪末为了迎接互联网的挑战而推出的应用程序平台 经过近年来的发展 它如今几乎可以在任何硬件平台上发挥作用 服务器 台式机 移动设备 游戏机 虚拟现实 增强现实环境 手表 甚至诸如R
  • TestBench编写_激励产生

    TestBench编写 激励产生 TestBench编写 激励产生 基本背景 读取函数介绍 a fopen函数使用 b fread函数使用 c fclose函数使用 实际使用 TestBench编写 激励产生 基本背景 最近遇到项目中需要对
  • 采用Vivado 配置xilinx GTX的SATA设计

    从Vivado开始 配置GTX的时候 多了一个SATA协议支持 但有些小地方还需要自己另外设置 整理了一下 分享给大家 首先打开Transceivers wizard 打开页签 线速率和参考时钟选择 在协议里面选择SATA2或者SATA3
  • leetcode696题计数二进制子串

    696题计数二进制子串 给定一个字符串 s 计算具有相同数量0和1的非空 连续 子字符串的数量 并且这些子字符串中的所有0和所有1都是组合在一起的 重复出现的子串要计算它们出现的次数 示例 1 输入 00110011 输出 6 解释 有6个
  • Python-opencv之目标定位

    最近团队准备参加一个无人机比赛 大致的规则是这样的 固定翼飞机从跑道起飞 然后在空中转体360 通过GPS粗定位飞行至一个高13米左右 宽6米左右八字形框前 距离约50米左右 这时依靠计算机视觉的方法 让飞机准确的穿过去 之后还有其他的动作
  • idea git提交忽略文件

    1 在idea的Plugin中 搜索 ignore插件 并安装使用 安装成功后会重启idea 2 在项目的根目录下创建一个创建一个 gitignore file 3 编辑gitignore文件 4 提交gitignore文件后 在该文件中限
  • unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新

    unity3d 理解刚体 Rigidbody 和碰撞体 Collider 以及触发器 Is Trigger 边学边更新 分类 Unity3D 2014 04 01 16 50 2755人阅读 评论 2 收藏 举报 刚体 Rigidbody