【Unity3d】碰撞检测
来源:互联网 发布:数控车床编程实例初级 编辑:程序博客网 时间:2024/06/06 08:56
Unity3d碰撞器
一.碰撞发生的必要条件:
1.产生碰撞效果需要具备两个因素
a.发起碰撞的物体
b.接收碰撞的物体
2发起碰撞的物体
a.Rigidbody
b.CharacterController
3.接受碰撞的物体
a.所有的Collider
二.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。
触发信息:
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中必须要带有Collider组件,并且A和B中至少一个物体携带Rigidbody
1.新建一个场景,添加CubeA,CubeB,Ground 三个物体,三个物体创建自Cube,默认带有BoxCollider组件
2.新建一个脚本,TestCollider,复写四个方法
OnCollisionenter,OnCollistionExit,OnTriggerEnter,OnTriggerExit,
在这几个函数中打印一些Log,注明当前进入的函数是哪个物体的哪个函数
3.给物体A和物体B挂上TestCollider脚本
4.为了方便测试,不给物体添加移动脚本了,运行游戏测试的时候,世界更改物体A或物体B的位置,使得A和B相交就行了
直接运行游戏,拖拽物体A移动到物体B处,未来发现打印任何的Log,因为A和B没有满足发生碰撞的必要条件,A和B只有Collider,
没有Rigidbody
5.为了进一步验证碰撞发生的必要条件,我们给a添加一个组件Rigidbody【默认Use Gravity打开,Is Kinematic关闭,
之前新建Ground物体就是为了防止有Rigidbody的物体往下掉落】,再次运行游戏,拖拽物体A移动到物体B,发现物体A不能够穿透物品B,
被B阻挡的效果,打印显示两个物品都进入了OnCollisionEnter和OnCollisitionStay方法
6.为什么只进入了CollisitionXX方法而没有进入OnTriggerXX方法呢,因为物体的Collider下的IsTrigger没有打勾,所以不会触发
7.现在把物体B的Is Trigger选项打勾,再次运行游戏,发现A会穿透B,且AB两个物体进入了OnTriggerXX函数。【这里有人会问,为什么只勾选物体B的
IsTrigger选项,起始勾选A,B任一个都行,或两个都勾选,但是这里勾选A的IsTrigger,物体A会直接掉落,可先把物体A的UseGravity钩去掉,勾选IsKinematic,再勾选IsTrigger】
四.总结
当Is Trigger=false时【Rigidbody 开启UseGravity,需要模拟物理碰撞】,碰撞器根据物理引擎引发碰撞,产生碰撞的物理效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时【Rigidbody,关掉UseGravity,开启IsKinematic,避免物体下落】,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
当需要看到物理碰撞效果的时候,调用OnCollistionXX
当需要碰撞后不影响物体位置方向等,调用OnTriggerXX
一.碰撞发生的必要条件:
1.产生碰撞效果需要具备两个因素
a.发起碰撞的物体
b.接收碰撞的物体
2发起碰撞的物体
a.Rigidbody
b.CharacterController
3.接受碰撞的物体
a.所有的Collider
二.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。
触发信息:
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中必须要带有Collider组件,并且A和B中至少一个物体携带Rigidbody
1.新建一个场景,添加CubeA,CubeB,Ground 三个物体,三个物体创建自Cube,默认带有BoxCollider组件
2.新建一个脚本,TestCollider,复写四个方法
OnCollisionenter,OnCollistionExit,OnTriggerEnter,OnTriggerExit,
在这几个函数中打印一些Log,注明当前进入的函数是哪个物体的哪个函数
3.给物体A和物体B挂上TestCollider脚本
4.为了方便测试,不给物体添加移动脚本了,运行游戏测试的时候,世界更改物体A或物体B的位置,使得A和B相交就行了
直接运行游戏,拖拽物体A移动到物体B处,未来发现打印任何的Log,因为A和B没有满足发生碰撞的必要条件,A和B只有Collider,
没有Rigidbody
5.为了进一步验证碰撞发生的必要条件,我们给a添加一个组件Rigidbody【默认Use Gravity打开,Is Kinematic关闭,
之前新建Ground物体就是为了防止有Rigidbody的物体往下掉落】,再次运行游戏,拖拽物体A移动到物体B,发现物体A不能够穿透物品B,
被B阻挡的效果,打印显示两个物品都进入了OnCollisionEnter和OnCollisitionStay方法
6.为什么只进入了CollisitionXX方法而没有进入OnTriggerXX方法呢,因为物体的Collider下的IsTrigger没有打勾,所以不会触发
7.现在把物体B的Is Trigger选项打勾,再次运行游戏,发现A会穿透B,且AB两个物体进入了OnTriggerXX函数。【这里有人会问,为什么只勾选物体B的
IsTrigger选项,起始勾选A,B任一个都行,或两个都勾选,但是这里勾选A的IsTrigger,物体A会直接掉落,可先把物体A的UseGravity钩去掉,勾选IsKinematic,再勾选IsTrigger】
四.总结
当Is Trigger=false时【Rigidbody 开启UseGravity,需要模拟物理碰撞】,碰撞器根据物理引擎引发碰撞,产生碰撞的物理效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时【Rigidbody,关掉UseGravity,开启IsKinematic,避免物体下落】,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
当需要看到物理碰撞效果的时候,调用OnCollistionXX
当需要碰撞后不影响物体位置方向等,调用OnTriggerXX
1 0
- unity3d碰撞检测
- unitY3D---(2)碰撞检测
- unity3d 碰撞检测
- Unity3d中的碰撞检测
- Unity3d 碰撞检测
- 【Unity3D】碰撞检测方案
- Unity3D碰撞检测
- unity3D 射线碰撞检测
- 【Unity3d】碰撞检测
- unity3d碰撞检测之立方体碰撞算法
- unity3d 简单碰撞检测代码
- Unity3D入门(二):碰撞检测
- Unity3D入门(二):碰撞检测
- Unity3D里的碰撞检测
- Unity3D学习笔记 碰撞检测
- Unity3D检测(碰撞、射线)
- Unity3D检测(碰撞、射线)
- [Unity3D]Unity3D 游戏开发之碰撞检测
- NotImplementedError: stat.st_dev unsupported or native support failed to load
- Android开源:数据库ORM框架GreenDao学习(二)数据库查询篇
- 今天
- openwrt 上cron的使用
- MySQL 获得当前日期时间 函数
- 【Unity3d】碰撞检测
- linux下利用fork()函数创建进程
- Html之 textarea 控件
- 用libmp4v2录制h264和aac rtp流为mp4文件
- Codeforces-698A Vacations
- Android:interpolator用法
- Struts2 学习笔记
- java jar 包导出报classnodefloadexception
- 浅谈LCA的离线算法