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

Unity3D 碰撞检测的条件和相关组件

2015-12-01 17:27 344 查看

CharacterController 与 Rigidbody

要产生碰撞,发起碰撞的物体必须要包含以上控件的其中一种。

角色控制器 Character Controller:

角色控制器主要用于第三人称或第一人称游戏主角控制,并不使用刚体物理效果。角色控制器是刚体(rigidbody)的子集。控制器不会对加在它自身上的力做出反应,也不会自动推开其他刚体。如果想让角色控制器推开其他刚体或者对象,你可以在对象附加的脚本中添加OnControllerColliderHit()函数,这样对它们施加力就能够产生碰撞。另外,如果你想让你的游戏角色被物理效果影响,那就最好使用刚体而不是角色控制器,角色控制器不受力的影响,仅仅当你调用Move函数时才运动。然后它将执行运动,但是受制于碰撞。。

刚体 Rigidbody:

刚体使物体能在物理控制下运动。刚体可通过接受力与扭矩,使物体像现实方式一样运动。任何物体想要受重力影响,受脚本施加的力的作用,或通过NVIDIA PhysX物理引擎来与其他物体交互,都必须包含一个刚体组件。

同时,被碰撞的物体必须包含Collider 控件

碰撞器 Collider:

检测碰撞的组件,分为boxcollider,sphere,mesh等等不同的形状,其中mesh collider是按照物体的网格来创建碰撞体的,比较消耗性能,一般复杂的模型会用一个简易模型来充当网格碰撞体的参考。

Static Collider 静态碰撞器

指的是没有附加刚体而附加了碰撞器的游戏对象。这类对象会保持静止或者很轻微的移动。对于环境模型十分好用,当和刚体碰撞时而不会移动。

Kinematic Rigidbody Collider 运动学刚体碰撞器

指的是同时包含碰撞器和刚体,并且激活IsKinematic的一类游戏对象,要移动这类游戏对象,要修改它的Transform组件,而不是用力,它不受游戏中其他对象力的作用。它们很像静态碰撞器不过对于想要不停地到处移动的碰撞器很好用。

补充:在所有Collider上有一个Is Trigger 的参数。设置参数为true后,当发生碰撞反应时,会调用碰撞双方的脚本 OnTrigger(),且不会发生后续物理的反应。 反之,脚本方面没有任何反应,并且会发生后续的物理反应。

在射击类游戏中会有处理子弹和角色碰撞的问题,由于子弹的移动速度很快,会造成前一帧和后一帧两个物体都没有碰撞的情况,也就不会发生击中的事件。为了避免这个问题,可将刚体 (Rigidbody) 设置成连续 (Continuous) 碰撞检测。将碰撞检测模式设置为连续 (Continuous) 可防止刚体 (Rigidbody) 穿过任何静止(即非刚体 (Rigidbody))静态网格碰撞体 (MeshCollider)。将其设置为连续动态 (Continuous Dynamic)还可防止刚体 (Rigidbody) 穿过任何其他在碰撞检测模式设置为 连续 (Continuous) 或连续动态 (Continuous Dynamic)。将其设置为连续动态 (Continuous Dynamic) 还可防止刚体 (Rigidbody) 穿过任何其他在碰撞检测模式设置为连续 (Continuous) 或连续动态 (Continuous Dynamic) 时支持的刚体 (Rigidbody)。连续 (Continuous) 碰撞检测旨在用作在对象否则会穿过彼此的情况下捕获碰撞的安全网,但是不会提供物理上准确的碰撞结果,因此如果遇到与快速移动对象有关的问题,则可能仍要考虑在时间管理器 (TimeManager) 检视视图 (Inspector) 中减小固定时间步长 (Time step) 值以使模拟更加精确。相对于离散 (Discrete)碰撞检测,连续检测会消耗更多的系统性能,所以在碰撞体速度不是很快的时候不需要启用连续检测。

另外发生碰撞一共有三种状态,可分别处理不同的事件:

1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器

2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器

3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: