您的位置:首页 > 移动开发 > Unity3D

unity中碰撞检测相关问题

2016-11-27 13:14 656 查看
在unity中,我们经常需要检测两个或多个物体之间是否发生碰撞,以及碰撞之后该如何处理等问题。下面我将总结一下自己在实践过程中遇到的一些问题,方便自己以后查阅,也希望能对帮助后来者有所帮助。

首先我们需要明确几个基本概念:

碰撞器:可以简单的理解为添加在游戏对象身上的一个组件。当然了,碰撞器有很多种,常用的有 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函数中将物体的位置赋值为获取到的前一贞的位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: