Unity教程之-Unity3d碰撞器与触发器的区别详解

 

前提:要用collider发生碰撞的话必须是使用力来移动物体。如果只是单纯的位置移动(transform.position)使用这种方法是不行的。必须有了物理的力Rigidbody或者charactercontroller移动才可以用collider的碰撞。

正文:

要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动。碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞。如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体会彼此相互穿过。

物体发生碰撞的必要条件:

两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体或者charactercontroller组件

在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。

碰撞器: 一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。

触发器 ,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。

触发信息检测:

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

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

3.MonoBehaviour.OnTriggerStay(Collider collider)当逗留触发器

碰撞信息检测:

1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器

2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器

3.MonoBehaviour.OnCollisionStay(Collision collision)  当逗留碰撞器

charactercontroler的控制移动碰撞:

unity5.0版本和unity4.0版本都一样的效果

直接建立两个cube就有collider,默认就可以发生碰撞。

为了验证碰撞器与触发器的区别,现设计一个简单的测试,首先建立两个cube(命名为move 和state)让move与state发生碰撞。move要加上charactercontroler和第一人称移动脚本(不用加rigidbody),同时给state加上 void OnTriggerEnter( Collider game)这个函数;代码和图如下:

using UnityEngine;
using System.Collections;

public class testco : MonoBehaviour {

void OnTriggerEnter( Collider game)//测试是否触发触发器
{
print(“enter”);
if (game.tag == “aa”)
{
print(“enterd”);
}
}
}

 测试结果:
当两物体全未勾选碰撞器的Is Trigger选项时可以发生碰撞

当只有move勾选时可以发生碰撞

当只有state 勾选时不发生碰撞;只有此时触发器触发,其他情况都不触发;

当两物体全都勾选不发生碰撞

Rigidbody的控制移动碰撞:

unity5.0版本 和unity4.0版本都一样的效果

与上述方法类似建立2个物体;capsule(用来移动,用rigidbody.MovePosition方法(移动方法可参照我之前博客文章(4.0和5.0方法不同))),cube静止,(绑定void OnTriggerEnter( Collider game)即上面代码testco脚本);

测试结果:

当两物体全未勾选碰撞器的Is Trigger选项时可以发生碰撞,cube上的触发器不触发

当只有capsule勾选时不发生碰撞 此时触发器触发

当只有cube 勾选时不发生碰撞;此时触发器触发;

当两物体全都勾选不发生碰撞,此时触发器触发

总结上面两种方法:

无论哪种方法要让触发器必然发生碰撞必须要将触发器的is Trigger勾选;无论哪种方法要让两个物体发生碰撞可以同时不勾选is Trigger.。

要让两物体同时发生碰撞和触发是不可能的;

如果混用了上述两种移动方法那么移动的物体必须勾选is Trigger ,这样才可以发生碰撞。如果要触发触发器那就两个物体全部勾选is Trigger。

下面是别人博客论述:

unity3d中的碰撞器和触发器的区别?

碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性

当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;

当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。(然而在  charactercontroler控制的运动中运动物体的Is Trigger=true时照样可以发生碰撞,所以我个人认为这句话有问题)

如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器

例子:

碰撞器:汽车被撞飞、皮球掉在地上又弹起效果

触发器:人站在靠近门的位置门自动打开效果

研究测试总结了一下午,若有不妥之处,欢迎大家提出交流。好了,本篇unity3d教程到此结束,下篇我们再会!