unity3d的碰撞检测及trigger
A、基本概念
要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。

下面就是我做的测试情况,都是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,给物体添加一个力,然后让物理引擎去让物体动,此时如果发生了碰撞的话,就不会穿越了。
碰撞的效果:
移动的刚体碰撞器VS静止的静态碰撞器
移动的刚体碰撞器VS静止的刚体碰撞器
移动的静态碰撞器VS静止的运动学刚体碰撞器
移动的运动学刚体碰撞器VS静止的静态碰撞器
移动的运动学刚体碰撞器VS静止的刚体碰撞器
移动的刚体碰撞器VS静止的运动学刚体碰撞器
移动的运动学刚体碰撞器VS静止的运动学刚体碰撞器
碰撞信息和触发信息
Collision detection occurs and messages are sent upon collision 碰撞后有碰撞检测并有碰撞信息发出 |
||||||
Static Collider 静态碰撞器 |
Rigidbody Collider 刚体碰撞器 |
Kinematic Rigidbody Collider 运动学刚体碰撞器 |
Static Trigger Collider 静态触发碰撞器 |
Rigidbody Trigger Collider 刚体触发碰撞器 |
Kinematic Rigidbody Trigger Collider 运动学刚体触发碰撞器 |
|
Static Collider 静态碰撞器 | Y | |||||
Rigidbody Collider 刚体碰撞器 | Y | Y | Y | |||
Kinematic Rigidbody Collider 运动学刚体碰撞器 |
Y | |||||
Static Trigger Collider 静态触发碰撞器 |
||||||
Rigidbody Trigger Collider 刚体触发碰撞器 |
||||||
Kinematic Rigidbody Trigger Collider 运动学刚体触发碰撞器 |
Trigger messages are sent upon collision 碰撞后有触发信息 |
||||||
Static Collider 静态碰撞器 |
Rigidbody Collider 刚体碰撞器 |
Kinematic Rigidbody Collider 运动学刚体碰撞器 |
Static Trigger Collider 静态触发碰撞器 |
Rigidbody Trigger Collider 刚体触发碰撞器 |
Kinematic Rigidbody Trigger Collider 运动学刚体触发碰撞器 |
|
Static Collider 静态碰撞器 | Y | Y | ||||
Rigidbody Collider 刚体碰撞器 | Y | Y | Y | |||
Kinematic Rigidbody Collider 运动学刚体碰撞器 |
Y | Y | Y | |||
Static Trigger Collider 静态触发碰撞器 | Y | Y | Y | Y | ||
Rigidbody Trigger Collider 刚体触发碰撞器 |
Y | Y | Y | Y | Y | Y |
Kinematic Rigidbody Trigger Collider 运动学刚体触发碰撞器 |
Y | Y | Y | Y | Y | Y |
unity3d的碰撞检测及trigger的更多相关文章
- unity3d立方体碰撞检测(c#代码实现)
由于unity自带的碰撞组件特别耗费性能,网上的unity物体碰撞的c#代码实现比较少,没有适合的,只能自己写一个来用: using System; using System.Collections. ...
- [Unity菜鸟] 笔记2 —— 问题篇
记录在学习<Unity 3.x 游戏开发 经典教材>时遇到的各种问题与笔记 1. 初始不能降低Terrain的高度,需要到Terrain设置的第二个按钮中将Height从0调高 (注意:最 ...
- Unity项目 - 坦克大战3D TankBattle
目录 游戏原型 项目演示 绘图资源 代码实现 技术探讨 参考来源 游戏原型 游戏玩法:在有界的战场上,玩家将驾驶坦克,代表绿色阵营,与你的队友一起击溃红蓝阵营的敌人,在这场三方大战中夺得胜利! 操作指 ...
- [Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放
貌似有一段时间没更新2dtoolkit系列了,这段时间一直在忙着其他事情,今天开始继续这个插件系列的教程,网上搜索,貌似关于这个插件的教程无非还是跟官方的教程很类似,有的甚至都没有自己照着亲手实践一遍 ...
- unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)
刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...
- Unity3d碰撞检测中碰撞器与触发器的区别
要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动.碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一起,除非两个对 ...
- Unity3D实践系列09, 物理引擎与碰撞检测
在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody.Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测.Collider组件中的"Is T ...
- (转)Unity3d中的碰撞检测
很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自 ...
- 【Unity3D】刚体与碰撞体以及is Trigger属性的意义
[Unity3D]刚体与碰撞体以及is Trigger属性的意义 刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚 ...
随机推荐
- ContentType&CORS&Git
ContentType django内置的ContentType组件就是帮我们做连表操作 如果一个表与其他表有多个外键关系,我们可以通过ContentType来解决这种关联 from django.d ...
- vue 兼容360及safari的方法
1. npm install --save-dev babel-polyfill 2. main.js 中 import "babel-polyfill"; 或者: ...
- kafka集群安装,配置
1.安装+配置(集群) 192.168.0.10.192.168.0.11.192.168.0.12(每台服务器kafka+zookeeper) # kafka依赖java环境,需要提前安装好jdk. ...
- fullPage的使用
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- VSCode搭建node + typescript开发环境
我们一起来喜欢TypeScript 现在写js不用TypeScript,伦家可能会觉得你是外星人. 是的,TypeScript很大程度增强了代码的可读性,可跟踪性,可维护性和减少了bug. 那么没有理 ...
- Restrictions用法
HQL运算符 QBC运算符 含义 = Restrictions.eq() 等于equal <> Restrictions.ne() 不等于not equal > Restrict ...
- 脸部识别JavaScript类库Tracking.js
作者 王文刚 发布于 2014年8月10日 | 对Web开发者而言,开源的JavaScript库Tracking.js正在使计算机视觉和增强现实技术变得简单, 使用它可以展示效果类似Kinect或 ...
- 用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题
用复制mysql/data 文件夹 下面的数据库的形式来复制数据库出现的问题 提示找不到表,我去看了一下,丢失了很多个表: 问题: 直接拷贝data下的数据库数据进行备份 , 发现部分数据表不见了. ...
- centos7 添加用户并授权root权限
centos7.2 版本,我们不可能每次都用root账号登陆,root账号公认的不安全,所以,首先,禁止掉root账号的登陆.1.静止root账号登陆. $ vi /etc/ssh/sshd.conf ...
- 【转】每天一个linux命令(59):rcp命令
原文网址:http://www.cnblogs.com/peida/archive/2013/03/14/2958685.html rcp代表“remote file copy”(远程文件拷贝).该命 ...