Unity --- 物理引擎 ---- 刚体RigidBody 与 碰撞器 collider

 

1.RigidBody(刚体)的作用是让物体具有物理特性(比如说重力,摩檫力等等)

2.如果想让物体能够与其它物体发生碰撞的话,我们还需要一个组件 --- Colider碰撞器组件

1.上图就是Unity中提供的已经准备好的各种形状的碰撞器组件

2.形成不同形状的碰撞器所需的面数不同,面数越少模拟碰撞时的性能消耗越少,一般在3d场景中为了节省性能,我们都是选择Box(立方体)碰撞器

1.center是碰撞器的中心点坐标,而size则是碰撞器的大小设置 --- 对于box colider来说,size三个值分别对应的是长x宽z高y

2.如果不想通过数值来调控碰撞器的形状位置和大小的话,也可以点击Edit Colider直接在场景中调节碰撞器的位置和形状

1.除了用设定好的形状来作为碰撞器之外,Unity还提供了一个具有“自适应”功能的碰撞器 --- Mesh Collider

2.传给该碰撞器物体的材质以及物体对应的模型的网格后,该碰撞器就会自动生成一个贴合物体模型的碰撞框

1.上面这个就是物体对应的模型的网格

2.该碰撞器组件挂在那个物体上就会自动获取该物体对应的模型的网格赋值给组件中的Mesh(当然也可以进行更改)

3.用了这个组件后能够达到最好的碰撞模拟效果,但是!代价是这种方式会十分消耗性能

1.convex --- adj.突出的

2.有没有一种方法即能够获得较好的碰撞效果,同时也能拥有较好的性能呢?

答案是有的:将Mesh Colider 中的Convex(尖锐的)选上即可 --- 选上后碰撞框的生成会发生改变 ---首先依然是根据物体对应的模型的面生成贴合的碰撞框,然后按照一定规律将面上的点连起来获得一个简化后尖锐突起的碰撞框

碰撞框在经过尖锐处理后我们就能够获得其简化版 --- 这个简化版的碰撞框牺牲了一定的碰撞效果,但却获得了较大的性能提升(而且牺牲后的碰撞效果依然在可接受的范围内)

2.使用了Mesh collider 而没有选择Convex的话,Unity是不会去模拟碰撞效果的(Untiy内部的规定)如果直接上,没用Convex,那就会导致碰撞框的检测面过多,使得碰撞效果的模拟非常耗性能 --- 使用了Convex后就能够适当减少碰撞框的面数 --- 进而使得我们在保证一定碰撞效果的同时获得较好的性能。

3.一般Mesh Collider碰撞框都是最后的一个选择 --- 虽然效果很好,但是实在是太吃性能了


刚体和碰撞器的相关属性值介绍

1.mass -- 质量 --- 下面有质量的取值范围

如果场景中只有一个游戏物体的话,质量为多少都无所谓,但是当场景中具有多个游戏物体时,我们就需要根据实际情况给每一个游戏物体设置质量了 --- 毕竟你不可能让石头和羽毛一样重吧

2.第二个属性drag 表示的是阻力(damping --- 衰减)--- 这个阻力指的是空气阻力

下面这张图中有设置空气阻力属性的参考值

 

 1.设置插值能够缓解刚体运动时产生的抖动,而插值的设置又分为两种形式 --- 内插值与外插值 --- 内外插值的区别就是 --- 各自是通过不同的方式来缓解刚体运动的抖动

 1.碰撞检测的模式由上往下 --- 检测的频率越来越大,性能的消耗也越来越大

 1.这个约束只会在刚体之间发生碰撞时触发

1.关闭Use Gravity后物体不受重力影响,但还是具有其它的物理-特性哦! 

2.刚体组件与碰撞器组件一般都是成对出现的,因为游戏物体与其它游戏物体互动并模拟出对应的物理效果的流程是:

a.先通过碰撞器组件进行碰撞检测 --- 将检测结果发给刚体组件 --- 刚体组件通过检测结果模拟出对应的物理效果

也就是说 --- 如果没有碰撞器组件只有刚体组件的话,游戏物体任然具有物理特性,但是无法进行碰撞检测,只会穿过其它游戏物体而不会产生互动

3.带了刚体组件的游戏物体的物理效果模拟并不是随时都在进行的,在物体静止时算法会关闭该物体的刚体组件,只有在物体运动时开启该物体的刚体组件来进行物理效果计算 --- 通过这种方式来节省游戏性能

4.只有碰撞器组件在工作的游戏物体相接触时只会返回碰撞结果,然后互相穿过(没有刚体组件工作来模拟物理效果的结果)

1.如果勾选了Is Kinematic的话,能够实现的效果就是 --- 游戏物体没有了物理特性,但是依然具有刚体特性 --- 即与其它具有刚体组件的游戏物体相撞进行碰撞检测后,其它游戏物体模拟物理效果,受到力的作用能够被撞开而不是穿过,且物体自身不受任何力的影响,不发生移动

2.刚体组件能够实现两个功能 --- a.使得物体具有“实体”而不会如幽灵一般穿过别人或者被穿过

b.使得物体具有物理特性(指物体受到的各种力,通过物理引擎模拟实现) 

3.碰撞框 --- 刚体组件内部逻辑:

a.一个物体a运动 --- 刚体组件中是否开启Is Kinematic --- 若开启则无物理特性(不受力的作用)只是具有实体 --- 若没开启,则具有物理特性,受到力的作用,物理引擎开始模拟物理效果

b.运动过程中与其它游戏物体b(b静止)发生碰撞 --- 首先b有没有碰撞框(collider),若没有无碰撞检测,试为前方没进行碰撞,穿过之 --- 若有则进行碰撞检测,并将结果返回给刚体组件 ---

若刚体组件有物理特性则开始模拟物理效果,反之则是继续去挤物体b但是穿不过去