Unity物理引擎之Collider

时间:2024-04-07 13:10:13

基本作用

Collider的基本作用就是阻止一个物体进入另一个物体。如果你没有给墙壁添加Collider,那么你就能穿过一堵墙。当然在Unity中,当你Create一个3D Object的时候,那个3D Object自动带有Collider。

为了加速渲染,Unity将Collider分为2大类,一类是位置不会变的Collider。另一类是位置会变的Collider。

因为位置不会变的Collider不会移动,所以我们只需要计算一次位置就可以了,这样就起到了加速的效果。我们把位置不会变的Collider称作静态Collider。

位置会变的Collider称作动态Collider,动态Collider又分为Rigidbody Collider和Kinematic Rigidbody Collider。

下面是我的学习笔记。


静态Collider

Unity物理引擎之Collider

当你Create一个Cube时,我们可以看到Cube含有5个Component,其中与本文相关的只有Box Collider。

在组件结构上,只含有Collider但没有Rigidbody的GameObject是静态Collider。

静态Collider用于不移动的物体。接近的动态Collider会和静态Collider相撞,但是静态Collider不会被移动。如果接近的是静态Collider,则不会相撞。(见本文结尾部分表格)

静态Collider不仅不应该移动,而且不应该在游戏中被取消或者设置。如果你违反了这些规则,那么会带来明显的性能损耗。


Rigidbody Collider

Unity物理引擎之Collider
一个既含有Collider又有Rigidbody(其中没有勾选Is Kinematic)的GameObject被称作Rigidbody。Rigidbody Collider用于移动的物体,受力的影响。比如在一场爆炸中,如果一个人被设置为Rigidbody Collider,那么这个人就会被炸飞。


Kinematic Rigidbody Collider

Unity物理引擎之Collider
如果你既想改变一个物体的位置,又希望这个物体不受力的影响,只受脚本的控制。比如说,一个超能力的人,不受爆炸的影响,可以站在原地丝毫不动。那么,就在GameObject中同时添加Collider和Rigidbody,并勾选Rigidbody中Is Kinematic选项。


Trigger

Unity物理引擎之Collider

Collider的作用除了碰撞之外,还可以检测一个动态Collider是否进入了一个区域,比如想让你的角色在进入一个房间的角落的时候,一只蜘蛛会从天花板上挂下来,那么你可以放一个Cube在那个角落,同时勾选Is Trigger选项。勾选了Trigger选项之后,其他的Collider就不会和它碰撞,而可以进入这个Collider,并触发OnTriggerEnter()等函数,于是我们可以在OnTriggerEnter函数中设置蜘蛛的行为。


碰撞效果矩阵

一个通用的规则是没有添加Rigidbody组件的对象不会受物理效果影响(不会碰撞、不会触发trigger效果)。

Collision detection occurs and messages are sent upon collision

- Static Collider Rigidbody Collider Kinematic Rigidbody Collider Static Trigger Collider Rigidbody Trigger Collider Kinematic Rigidbody Trigger Collider
Static Collider Y
Rigidbody Collider Y Y Y
Kinematic Rigidbody Collider Y
Static Trigger Collider
Rigidbody Trigger Collider
Kinematic Rigidbody Trigger Collider

Trigger messages are sent upon collision

- Static Collider Rigidbody Collider Kinematic Rigidbody Collider Static Trigger Collider Rigidbody Trigger Collider Kinematic Rigidbody Trigger Collider
Static Collider Y Y
Rigidbody Collider Y Y Y
Kinematic Rigidbody Collider Y Y Y
Static Trigger Collider Y Y Y Y
Rigidbody Trigger Collider Y Y Y Y Y Y
Kinematic Rigidbody Trigger Collider Y Y Y Y Y Y