unity中碰撞检测相关问题
2016-11-27 13:14
656 查看
在unity中,我们经常需要检测两个或多个物体之间是否发生碰撞,以及碰撞之后该如何处理等问题。下面我将总结一下自己在实践过程中遇到的一些问题,方便自己以后查阅,也希望能对帮助后来者有所帮助。
触发器:可以理解为碰撞器组件中的一个属性(IsTrigger),当我们在检视面板(Inspector)的碰撞器组件中勾选了IsTrigger属性,就是用了触发器。
2. 其中一个物体还必须添加刚体组件(Rigidbody),添加了这个组件的游戏对象可以接受外力和扭矩力,并且像真实的物体一样接受摩擦力和重力,还可以与其他物体发生相互碰撞。通常我们将Rigidbody添加给移动的物体
drag 空气阻力,当物体受力运动时空气的阻力,以牛顿计算。
angular drag 空气角阻力,当物体受扭矩力选择时空气的阻力,以牛顿计算。
use gravity 使用重力,当开启此项,物体会受到重力作用。
is kinematic 是否开启动力学,开启此项,物体不受力的作用。
constrants:约束。用于控制刚体运动的约束。
OnTriggerStay函数是基于物理计时器,因此它未必每帧都运行。也就是说OnTriggerStay是在每一个Time.fixedDeltaTime的时间节点上运行,不是Time.deltaTime的时间节点上运行
以上几个方法基本足够日常的开发了,下面是一些具体的小问题。
在主动发起碰撞的物体的脚本中的Undate()方法中使用 this.enabled=false; 这样就会停止调用Update方法,此时所有在Update中的操作都不会被执行。
勾选被撞物体的rigibody组件的isKinematic属性
此时这个物体将只有碰撞属性而不具备物理学属性
在碰撞检测函数中获取运动物体前一贞的位置,在Update函数中将物体的位置赋值为获取到的前一贞的位置。
首先我们需要明确几个基本概念:
碰撞器:可以简单的理解为添加在游戏对象身上的一个组件。当然了,碰撞器有很多种,常用的有 Box Collider,Sphere Collider,Capsule Collider,Mesh Collider等。触发器:可以理解为碰撞器组件中的一个属性(IsTrigger),当我们在检视面板(Inspector)的碰撞器组件中勾选了IsTrigger属性,就是用了触发器。
发生碰撞的必要条件:
1. 参与碰撞的物体身上必须都添加碰撞器(Collider)组件2. 其中一个物体还必须添加刚体组件(Rigidbody),添加了这个组件的游戏对象可以接受外力和扭矩力,并且像真实的物体一样接受摩擦力和重力,还可以与其他物体发生相互碰撞。通常我们将Rigidbody添加给移动的物体
刚体组件的具体参数:
mass 质量,以千克计算。drag 空气阻力,当物体受力运动时空气的阻力,以牛顿计算。
angular drag 空气角阻力,当物体受扭矩力选择时空气的阻力,以牛顿计算。
use gravity 使用重力,当开启此项,物体会受到重力作用。
is kinematic 是否开启动力学,开启此项,物体不受力的作用。
constrants:约束。用于控制刚体运动的约束。
碰撞器检测:
1. Collider.OnCollisionEnter(Collision) 当碰撞进入
当该collider/rigidbody开始碰到另一个rigidbody/collider时OnCollisionEnter被调用。相比OnTriggerEnter,OnCollisionEnter传递Collision类而不是Collider。Collision类包含接触点,碰撞速度等信息。在这个函数如果你不使用collisionInfo,删去collisionInfo参数以避免不必要的计算。注意,当其中至少一个碰撞器附加非动力学刚体时碰撞事件才会发送。碰撞事件也发送给禁用的MonoBehaviours,允许启用Behaviour来相应碰撞。2. Collider.OnCollisionStay(Collision) 当碰撞停留
每当该collider/rigidbody碰到其他rigidbody/collider,将在每帧调用OnCollisionStay。通俗的说,一个碰撞器或刚体碰到另一个刚体或碰撞器,在每帧都会调用OnCollisionStay,直到它们之间离开不接触。3. Collider.OnCollisionExit(Collision) 当碰撞退出
当 collider/rigidbody停止碰撞另一个 rigidbody/collider时,OnCollisionExit被调用。触发器检测:
1. Collider.OnTriggerEnter(Collider) 当触发进入
当碰撞器进入触发器时OnTriggerEnter被调用。这个消息被发送到触发器和触发碰撞器属于的刚体(如果有),以及碰到触发器的刚体(或如果没有刚体的碰撞器)。注意,如果碰撞器有附加的刚体,触发器事件才发送。触发器事件也发送给禁用的MonoBehaviours,允许启用Behaviour来相应碰撞。2. Collider.OnTriggerStay(Collider) 当触发停留
每当碰撞器从进入触发器,几乎每帧调用OnTriggerStay。OnTriggerStay函数是基于物理计时器,因此它未必每帧都运行。也就是说OnTriggerStay是在每一个Time.fixedDeltaTime的时间节点上运行,不是Time.deltaTime的时间节点上运行
3. Collider.OnTriggerExit(Collider) 当触发退出
当该碰撞器停止接触触发器时,OnTriggerExit被调用。也就是说,当碰撞器离开触发器时,调用OnTriggerExit。以上几个方法基本足够日常的开发了,下面是一些具体的小问题。
1. 当检测到两个物体发生碰撞时,如何让运动的物体停止运动?
this.enabled=false;
在主动发起碰撞的物体的脚本中的Undate()方法中使用 this.enabled=false; 这样就会停止调用Update方法,此时所有在Update中的操作都不会被执行。
勾选被撞物体的rigibody组件的isKinematic属性
此时这个物体将只有碰撞属性而不具备物理学属性
在碰撞检测函数中获取运动物体前一贞的位置,在Update函数中将物体的位置赋值为获取到的前一贞的位置。
相关文章推荐
- Unity5.5.2碰撞检测碰撞点坐标问题
- unity解决快速运动物体碰撞检测穿透问题
- 关于碰撞检测的相关信息
- 碰撞检测系统中的设计问题
- unity3d刚体和碰撞检测学习一:新建一个plane和一个sphere,却碰撞检测失败的问题
- [Unity菜鸟] Unity Web Player 相关问题 (待完善)
- QT按键判断和碰撞检测的问题,紧急求助啊!!!3Q
- 旧话重提---使用FxCop检测出字符串相关的2个问题
- [Unity-4] 碰撞检测
- (转)unity开发相关环境(vs、MonoDevelop)windows平台编码问题
- android 和java 内存泄漏检测相关问题
- 学习 "使用cocos2d-x3.0和物理引擎实现碰撞检测" 中出现的一个问题
- F问题3-7:以太网使用载波监听多点接入碰撞检测协议CSMA/CD。频分复用FDM才使用载波。以太网有没有使用频分复用?
- (原)unity开发相关环境(vs、MonoDevelop)windows平台编码问题
- unity基础开发----导入模型碰撞检测
- Unity 碰撞检测
- 关于检测元件中的透明度的问题,然后可以用来检测碰撞
- 碰撞检测算法相关
- unity开发相关环境(vs、MonoDevelop)windows平台编码问题
- Unity中武器与人物的碰撞检测