关于unity碰撞检测器的用法
今天已经是我第三次忘记了这两种碰撞检测的用法,混淆了。特意整理一下
首先把今天要解决涉及到的东西列出来
碰撞方法:
public void OnTriggerEnter(Collider other)
public void OnTriggerExit(Collider other)
public void OnTriggerStay(Collider other)
public void OnCollisionEnter(Collision collision)
public void OnCollisionExit(Collision collision)
public void OnCollisionStay(Collision collision)
public void OnTriggerEnter2D(Collider2D collision)
public void OnTriggerExit2D(Collider2D collision)
public void OnTriggerStay2D(Collider2D collision)
public void OnCollisionEnter2D(Collision2D collision)
public void OnCollisionExit2D(Collision2D collision)
public void OnCollisionStay2D(Collision2D collision)
涉及到的组件:
Rigidbody-IsKinematic
Colider-IsTrigger
好了 我们来分析
上面的6个方法 中的 Enter Exit Stay 这三种很好理解,第一个是进入时候触发,第二个是离开的时候出发,第三个是 呆在里边的时候触发。。
这个理解好了 那么我们主要要分析的是事
public void OnTriggerEnter(Collider other)
public void OnCollisionEnter(Collision collision)
这两个方法 在不同的状态下 哪个被被触发。
首先他们两个参数 一个是Collider 一个是Collision
Collision里边也包含Collider
通过
collission.collider可以访问到collider
那么他们两种参数的不同的原因是什么呢?稍后考虑
好了 下面开始测试
1:
两个物体都添加colider组件
上面的物体添加一个rigidbody 测试:
结果是 两个物体都触发OnCollisionEnter
2:
两个物体都添加colider组件
两个物体添加rigidbody 测试:
下面的物体点上IsKinematic让他不动
结果跟第一次的结果一样 两个物体都触发OnCollisionEnter
3:
两个物体都添加colider组件
两个物体添加rigidbody 测试
都不点上IsKinematic 然后用外力让他们碰撞
结果是两个都触发了OnCollisionEnter
4:去掉一个物体的colider,结果就没有任何触发
结论1:任何一方如果没有colider 就不会有任何触发
2:只要有任何一个有刚体 无论是不是点上IsKinematic 都会触发OnCollisionEnter
3:以上的测试 都没有遇到过OnTriggerEnter,所以可以断定 如果colider中的IsTrigger没有勾选就永远你不会触发OnTriggerEnter。
下面测试 如果两个物体都电商了IsTrigger。
1.上面的物体加colider和rigidbody
下面的物体 添加colider
两个物体都点上isTrigger
结果 两个物体没有发生碰撞 穿过了 但是两个物体都触发了OnTriggerEnter 传进来的参数 是 另外跟他碰撞的物体的collider
2各种测试 只要任何一个物体一旦点上了IsTrigger 那么就不会产生碰撞 也不会产生OnCollisionEnter 。但是会触发OnTriggerEnter
结论: 1 两个物体产生碰撞的基础是 两个物体都有colider。
2 两个物体产生碰撞后 产生物理效果比如撞击 阻挡等 的必要条件是 其中一方必须含有rigidbody
3 任何一个物体 一旦选中了 isTrigger 那么就不会产生 撞击 阻挡的效果 而且永远不会触发OnCollisionEnter,但是这个时候他本身的rigidbody可以产生重力等外力的影响 不过不会触碰其他的东西。
4 无论这个物体是否已经选中了 isTrigger 只要其中一个选了isTrigger 那么两个物体都会触发OnTriggerEnter。
总结:
无论是OnTriggerEnter还是OnCollisionEnter
都是碰撞双方共同触发,传入的参数就是对方。
一旦选中了 isTrigger,那么这个物体就无视了自己和其他的一切碰撞。
如果没有了碰撞就没有OnCollisionEnter的触发条件。但是会触发OnTriggerEnter。
因此可以这么理解OnTriggerEnter是OnCollisionEnter的替补选手。
那么他们用在什么地方呢?
如果在一个游戏场景中 如果一个足球场 那么这个足球场地 肯定是没有rigigbody,而球员 和球都是有rigidbody的物理体,那么他们人和人之间的碰撞 或者人踢球的动作,碰撞之间就会自动触发OnCollisionEnter。
在代码中编辑OnCollisionEnter就可以达成任何想要的结果。
而如果一个游戏场景中 还是那个足球场 如果想要判定足球出街 或者进球门得分 这样的,那么 就要在 界限那里设定一个 空物体 加上colider,然后点上.isTrigger,那么球出界到这里就会触发OnTriggerEnter。
那么回到我这个本身的游戏中。。。
我的这个射出来的弓箭 要射中敌人 还要射中墙
人物不会被奸所伤 但是会摔死
不被摔死走出出口也要被销毁
那么 销毁点做一个isTrigger就可以
其他都用碰撞器来解决。
ok!
自己的思路清晰了 这篇文章 过两天没事的 整理整理 先这样放着吧 很多错字 很凌乱。
关于unity碰撞检测器的用法的更多相关文章
- Unity射线检测的用法总结
RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...
- Unity 碰撞的例子
1.新建一个3D的Unity工程. 2.菜单 "GameObject" - "3D Object",选择"Cube" 和 "Cap ...
- Unity 碰撞器
Unity引擎的碰撞器 常见的有Box Collider,Capsule Collider等等 IsTrigger(触发器) 在这些碰撞器中有一个属性 Is Trigger(是否使用触发器) 触发器事 ...
- unity碰撞组件、刚体组件
游戏导入标准资源包“Character Controllers”后可以为游戏对象添加 character(角色控制器)组件: 添加角色控制器组建以后可以控制游戏对象移动: 角色控制器组件因为与碰撞组件 ...
- Unity 3D UGUI Toggle用法教程
UGUI Toggle用法教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
- Unity碰撞器触发关系测试
本文刚体有关的内容不再赘述,主要测试碰撞器和触发器的消息关系. 刚体在这篇有测试:U3D刚体测试1-刚体非刚体物体非Kinematic等之间的碰撞关系 碰撞器测试结果: 1.A对象为Collider, ...
- unity Transform Find 的用法!!!
用法: Transform Find(String name) 1.查找名为name的(transform.gameObject)直接子物体并返回该子物体的Transform属性.不能是孙子物体或更低 ...
- Unity NGUI Tween的用法
unity版本:4.5 NGUI版本:3.6.5 参考链接:http://www.colabug.com/thread-1029974-1-1.html,作者:COLABUG.COM 橘虞 htt ...
- (@WhiteTaken)Unity中Invoke的用法
今天无意间读到大神写的代码,看到了Invoke函数,于是产生兴趣.后来才明白自己要学习的东西还有很多. 下面讲用法. Invoke是延时调用函数,在用Invoke函数之前需要引入命名空间using U ...
随机推荐
- 基于海明距离的加权平均值人职匹配模型(Sqlserver2014/16内存表实现)
最近给某大学网站制作一个功能,需要给全校所有的学生提供就业单位发布职位的自动匹配,学生登陆就业网,就可以查看适合自己的职位,进而可以在线投递. 全校有几万名学生,注册企业发布的职位也有上万,如何在很短 ...
- 数据绑定控件之Repeater
引言 前几篇的文章在说AJAX的内容,利用AJAX技术能够开发出高效运行的网站应用程序,不过在进行B/S项目开发时只拥有AJAX技术是远远不够的,踏入到B/S要学的东西会更多,但相较C/S的复杂逻辑结 ...
- .net常见的面试题
1,asp.net中的页生命周期 答:msdn官网已给出标准答案,这里简述一下:页要经历下表概述的8个阶段.除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页. 而这8个阶 ...
- 捷波朗 jabra BT3030 蓝牙耳机
蓝牙版本V2.0 通话时间 8小时 按键说明:轻敲 快按轻敲两下 在1.5秒内快速按两下按 大约 1秒钟按住 大约 4秒钟 充电提示绿灯闪亮 正在充电持续绿灯 已完全充满电 检查电量按 音量上调(+) ...
- [转]在 Web 项目中应用 Apache Shiro
目录[-] 用户权限模型 图 1. 用户权限模型 认证与授权 Shiro 认证与授权处理过程 Shiro Realm 清单 1. 实现自己的 JDBC Realm 为何对 Shiro 情有独钟 与 S ...
- u-boot移植 II
下面是韦老师的uboot移植攻略: A. 开发板的相关拷贝与修改 1. 在board文件夹下面, 将原来的smdk2410复制为100ask24x0目录, 并将smdk2410.c改名为100ask2 ...
- $scope.$watch()——监听数据变化
$scope.$watch(watchFn, watchAction, [deepWatch]):监听数据变化,三个参数 --watchFn:监听的对象,一个带有Angular 表达式或者函数的字符串 ...
- 005_重写 Standard Delete Button
以后会用JS直接删除,但是在加载.js时候出现问题,会在以后进一步追踪完善: <apex:page standardController="Opportunity" > ...
- Java线程中带有返回值的线程Callable
在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务(也可以叫做线程)了. 可返回值的任务必须实现C ...
- A ship is always safe at the shore - but that is not what it is built for.
A ship is always safe at the shore - but that is not what it is built for. 船靠岸边总是安全的,但那不是建造它的目的.