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属性的意义 刚体:个人理解就是具有物理属性(如:质量),接受物理作用(如:重力)的组件. 碰撞体:个人理解就是计算碰撞后的物理量(如:弹力). 刚 ...
随机推荐
- JSP--TOMCAT-MYSQL web页面添加
addStudent.jsp如下<%@ page language="java" import="java.util.*" pageEncoding=&q ...
- ul li列子
<html> <body> <p>有序列表:</p> <ol> <li>打开冰箱门</li> <li>把 ...
- conan-transit服上的库列表
conan-transit服上的库列表 因为获取列表比较慢,所以获取后在此记录,以备查找.conan-transit 是个只读库,不会有更新.新的库将上传到 conan-center. conan是C ...
- dependencies与dependencyManagement的区(转自:http://blog.csdn.net/liutengteng130/article/details/46991829)
在上一个项目中遇到一些jar包冲突的问题,之后还有很多人分不清楚dependencies与dependencyManagement的区别,本篇文章将这些区别总结下来. 1.DepencyManagem ...
- 使用Ant搭建Android开发环境入门
使用Ant搭建Android开发环境入门 使用Ant搭建Android开发环境,建立android项目 配置Ant环境 下载Ant:http://ant.apache.org/bindownloa ...
- matlab sparse()
一.sparse()的稀疏矩阵简单运用 1.>> A = [0, 0, 0, 0; 0, 0, 1, 0; 0, 0, 0, 0; 0, 1, 0, 2]; >> sparse ...
- JavaScript 之arguments、caller 和 callee 介绍
1.前言 arguments, caller , callee 是什么? 在javascript 中有什么样的作用?本篇会对于此做一些基本介绍. 2. arguments arguments: ...
- com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. 问题解决方法
一.问题 今天用mybatis连接数据库时出现了如下错误: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The serve ...
- hdu2068 RPG的错排 组合数/递推
#include<stdio.h> ]; long long c(int a,int b) { ,j; ;i>=a-b+,j<=b;i--,j++) sum=sum*i/j; ...
- Servlet基本操作
一.Servlet的请求流程 web项目中的web.xml文件配置为: <servlet> <!--别名--> <servlet-name>Hello</se ...