《Unity 4 3D开发实战详解》一6.2 碰撞器

简介: 在上一节中,讲解了刚体的主要特性,在本节中将对碰撞器(Collider)进行具体介绍。碰撞器是Unity内建物理引擎中另外一个很重要的概念。弄清楚碰撞器的概念对于Unity开发新手来说是很重要的。

本节书摘来异步社区《Unity 4 3D开发实战详解》一书中的第6章,第6.2节,作者: 吴亚峰 , 杜化美 , 张月霞 , 索依娜 责编: 张涛,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.2 碰撞器

Unity 4 3D开发实战详解
在上一节中,讲解了刚体的主要特性,在本节中将对碰撞器(Collider)进行具体介绍。碰撞器是Unity内建物理引擎中另外一个很重要的概念。弄清楚碰撞器的概念对于Unity开发新手来说是很重要的。

Unity中内建的碰撞器主要包括6种,具体情况如下所述。

  • 盒子碰撞器——BoxCollider

盒子碰撞器是一个基本的方形碰撞器原型,可以被调整成不同大小的长方体,能够很好地用于门、墙、平台等,也能够用于角色的躯干或者车辆等交通工具的外壳。

一般地,盒子碰撞器都是用于较规则的物体上,恰好将所作用的对象的主要部分包裹住。因此,适当的使用该碰撞器可以减少物理计算,提高性能。

  • 球体碰撞器——SphereCollider

球体碰撞器是一个基本的球形碰撞器原型,在三维上可以均等地调节大小,但不能只改变某一维。适合用于落石、乒乓球、弹球等。

  • 胶囊碰撞器——CapsuleCollider

胶囊碰撞器由一个圆柱体连接两个半球体组成,是一个胶囊状碰撞器原型。胶囊碰撞器的半径和高度都可以单独调节。可用于角色控制器或者和其他碰撞器结合用于不规则的形状。

  • 网格碰撞器——MeshCollider

网格碰撞器利用一个网格资源并在其上构建碰撞器。对于复杂网状模型上的碰撞检测,它要比应用原型碰撞器精确的多。其通过附加在游戏对象上的网格构建碰撞效果,并严格按照所附加对象的Transform属性来设定其位置和大小比例。

  • 车轮碰撞器——WheelCollider

车轮碰撞器是一个特殊的地面车辆碰撞器。其具有内置的碰撞检测、车轮物理引擎和一个基于滑动的轮胎摩擦模型。当然,也可以用于其他对象,但其是专门为有轮子的车辆设计的。车轮的碰撞检测是通过自身中心向外投射一条y轴方向的射线来实现的。

车轮碰撞器将在后面的交通工具章节有更详细的介绍和具体使用,这里不再赘述。

  • 地形碰撞器——TerrianCollider

地形碰撞器主要作用于地形与其上的物体之间的碰撞,给地形加上地形碰撞器可以防止添加了刚体属性的对象会无限的往下落。

说明

实际开发中,常常将多种碰撞器组合来使用,这样可以保证碰撞的真实性。

6.2.1 碰撞器的添加

Unity开发平台下,如果开发者想要对游戏中的对象进行碰撞处理是很简单的事情,对于某个游戏对象,只需要对其附加上碰撞器即可实现。在Unity中,碰撞器作为游戏对象的一个组件,可以被随意地添加或者删除。下面将介绍碰撞器的添加方式。

1.碰撞器的基本添加方法
在这里仅仅介绍基本碰撞器的使用。对于某个物体,如果只是要求起到简单的碰撞效果,那么只要单纯地附加碰撞器即可,具体的步骤如下。

(1)首先创建一个立方体对象,按照GameObject→CreateOther→Cube顺序完成创建,如图6-22所示。

(2)在游戏组成对象列表中,找到第(1)步创建的立方体对象,选中此对象。在属性查看器中看到此立方体的所有属性,注意到其有一个名为BoxCollider的组件,这就是所谓的碰撞器,如图6-23所示。

(3)可以在“BoxCollider”处鼠标右键单击,在弹出的列表中选择“Remove Component”选项,通过此操作可以去除已经包含在游戏对象中的碰撞器,如图6-24所示。

(4)在立方体对象选中状态下,单击菜单栏中的“Component”选项。在弹出的菜单中选择“Physics”,在弹出的菜单中选择“Box Collider”,通过此操作为当前的立方体对象附加了碰撞器,如图6-25所示。


6_22_23
6_24_25

说明

一般情况下,只能直接为对象指定一个碰撞器,另外指定的碰撞器会替换当前的碰撞器,如果将要替换的碰撞器和当前的碰撞器是同一种类的,则提示不能完成操作。

2.碰撞器的组合使用
在基础项目的开发中,碰撞器的附加是很简单的,在前面的内容中已经进行了讲解。在某些场合中,由于Unity内建的碰撞器都是规则的形状类型,如果需要对一些非规则形状的物体进行碰撞事件处理,就让人有些手足无措,在这部分将为解决此类问题提供一种最适合的方案。

该方案的具体步骤如下。

(1)按照步骤GameObject→CreateOther→Plane新建一个平面做地面,并为其指定纹理,如图6-26所示。


6_26

(2)按照顺序GameObject→CreateOther→Capsule新建一个胶囊(Capsule),将纹理图拖曳到其上,指定好其纹理,将其放置到平面的上方,摄像机的正前方,作为碰撞器组合体的主体,如图6-27所示。


6_27

(3)分别按照顺序GameObject→CreateOther→Cube和顺序GameObject→CreateOther→Sphere新建一个立方体和一个球体。将立方体和球体分别放置在前面创建的胶囊的上方和下方,相对位置如图6-28所示。


6_28_29

(4)对球体进行缩放,直至胶囊把其完全掩盖住,在属性查看器中修改其SphereCollider组件的Radius值为1.5,如图6-29所示。将立方体进行如上操作,将其盒子碰撞器组件的size值设为(2.5,2.5,2.5),如图6-30所示,得到效果如图6-31所示。


6_30_31

(5)最后在游戏组成对象列表中,按住Ctrl键,同时选中立方体和球体对象,将两个对象拖曳到胶囊对象上,形成对象的父子关系,如图6-32所示。


6_32

(6)选中胶囊对象,按照Component→Physics→Rigidbody为其添加刚体。单击游戏预览开始按钮,观看效果,如图6-33所示。

说明

本案例的场景文件位于随书光盘中源代码/第6章目录下的 PhysicsEngine/Assets/ Scene/ ColliderGroup。为了简化操作顺序,本案例采用胶囊作为不规则物体的替代物,读者可以举一反三,对更加复杂的模型进行碰撞器拼接,以达到预期效果。


6_33

6.2.2 碰撞过滤

在Unity开发过程中,对于某些游戏对象,如果两者之间进行的碰撞是毫无意义的或者不符合现实,那么就要规避两者之间的碰撞,在Unity平台下利用了碰撞过滤的概念来解决此类问题。

碰撞过滤就是在某些物体之间不进行碰撞检测。可以是层与层之间,也可以是两个物体之间。这就给开发者以很大的灵活性。

1.通过代码实现两两之间不进行碰撞检测
在Unity中,项目的物理环境不仅能够通过在开发环境下进行简单的菜单项设置,还可以通过脚本的编写来控制设置。设置两两之间不进行碰撞检测的原理是在脚本激活的时候,设置当前对象的忽略碰撞体为某一个对象。

下面以实现当前对象与两个对象进行碰撞检测为例说明,具体的代码如下所示:

1 var ballpre1:Transform;   //另外两个球的引用
2 var ballpre2:Transform;
3 function Start(){    //开始方法在对象被激活时开始执行
4  Physics.IgnoreCollision(ballpre1.collider, collider); //控制该对象不和ballpre1和ballpre2发生碰撞
5  Physics.IgnoreCollision(ballpre2.collider, collider);
6 }

第1-2行为获取不碰撞体的引用。需要在开发环境下的属性查看器中指定两个对象。
第3-6行为设置当前对象不与ballpre1和ballpre2进行碰撞。
2.层与层之间的碰撞过滤
前面的内容介绍了脚本控制碰撞过滤的用法,接下来将通过一个案例讲解层间碰撞过滤的具体使用方法。具体步骤如下。

(1)导入纹理图片资源,在资源列表中鼠标右键单击,在弹出的菜单中选择“Import New Assest…”选项,如图6-34所示,在出现的如图6-35对话框中选择要导入的图片资源,如图6-35所示。


6_34
6_35
6_36

(2)按照GameObject→CreateOther→Plane的顺序新建一个平面作为地面。并将前面导入的纹理图拖曳到该平面上,从而为其指定纹理,如图6-36所示。

(3)按照Edit→RenderSetting的顺序,打开渲染设置,如图6-37所示。


6_36
6_37

(4)通过上一步的操作,会在属性查看器中呈现出场景的渲染设置编辑器。在其中设置“Ambient Light”,如图6-38所示,选择AmbientLight后面的属性框,在弹出的颜色选择框中选择白色,如图6-39所示。

(5)通过操作GameObject→CreateOther→Sphere创建一个球体,如图6-40所示。

(6)在资源列表中鼠标右键单击,在弹出的菜单中选择“Create”,在弹出的菜单中选择“Material”,如图6-41所示。在属性查看器中,设置MainColor为红色,Base为任意一张纹理图,如图6-42所示。


6_38
6_39
6_40
6_41_42

(7)为球体添加刚体,按照Component→Physics→RigidBody的顺序为球体添加刚体,如图6-43所示。

(8)添加一个层,选中球对象,单击属性查看器中的Layer属性,在弹出的菜单中选择“Add Layer”,如图6-44所示。在任意一个UserLayer后添加“red”,以添加层并命名为red,如图6-45所示。

(9)再次单击球体对象,在属性查看器中单击Layer,如图6-46所示,此选择“red”。经过此操作就为该球体制定了所在层为“red”。


6_43

(10)按照步骤(5)~步骤(7)的操作,分别创建出5个红色球,5个蓝色球,5个绿色球。

(11)按照步骤(8)~步骤(9)的操作,分别创建3个层。并将所有的红色球指定层为red,将所有的蓝色球指定为层“blue”,将所有的绿色球指定层为“green”,如图6-47所示。


6_44
6_45
6_46
6_47

(12)设置物理管理器。按照顺序Edit→ProjectSettings→Physics打开物理管理器。在属性查看器中会呈现物理管理器,如图6-48所示。


6_48

(13)设置物理管理器。在物理管理器中,在Layer Collision Matrix属性中,去掉green行与green列的对勾,red行与red列的对勾,blue行与blue列的对勾,以设置同一个层之间不进行碰撞检测,而不同的层之间进行碰撞检测,如图6-49所示。

(14)将球按照图6-49所示的相对位置进行摆放,单击运行查看效果,如图6-50所示。


6_49_50

说明

本案例的场景文件位于随书光盘中源代码/第6章目录下的 PhysicsEngine/Assets/ scene/ collisionfilter。在单击运行按钮后会发现图中第1列、第3列及第5列的球没有进行碰撞发生了叠加现象,而第2列和第4列3个球发生碰撞,这就是通过设置层间碰撞状态达到的效果。

6.2.3 物理材质

在Unity开发过程中,开发者往往会需要碰撞体实现特殊的碰撞效果,例如篮球撞击篮板的效果,铅球坠落到沙地的效果,实现这些都要使用物理材质的概念。

物理材质顾名思义就是指定了物体的物理特性。它定义了物体的弹性和摩擦因数,在实际开发过程中,开发者可以调节其属性已达到满意效果。

1.物理材质属性
物理材质有多个可调属性,这些属性关乎着物体的弹性和摩擦因数,并且还设定了碰撞体间的摩擦和弹性混合模式,为了适应某个物体的不同方向摩擦力不同而设定的各向异性方向。各主要参数如表6-2所示。


b6_2

2.物理材质的创建
作为影响物体的碰撞反应的又一重要因素,物理材质规定了物体的弹性和摩擦特性。材质的差别可能很大程度上影响物体的运动表现。物理材质的创建可以通过两种操作实现。

(1)在菜单栏中单击“Assests”选项,会出现资源操作列表,选择“Create”选项,将会弹出创建列表,在创建列表中选择“Physics Material”。即可创建出一个物理材质,同时在属性查看器中出现物理材质的编辑器,如图6-51所示。


6_51

(2)在资源列表面板下,鼠标右键单击空白处同样会出现资源操作列表,选择“Create”选项,将会弹出创建列表,在创建列表中选择“Physics Material”,即可创建出一个物理材质。同时在属性查看器中出现物理材质的编辑器,如图6-52所示。

3.物理材质的设置
在开发过程中,物理材质的使用关乎到模拟现实是否成功的重要因素之一。Unity为开发预留的变量使得调节物体的物理特性变得异常简单,但是关于如何决定材质的取值,就完全靠经验来确定了。下面介绍一些物理材质选择的小技巧,希望对读者有所启发。

物理材质的设定大概需要3方面的修改,如图6-53所示。


6_52_53

(1)摩擦因子的设定。

滑动摩擦因子或静摩擦因子的取值范围为0~1,当滑动摩擦因子或静摩擦因子取值为0时,被此材质控制的对象将拥有冰的效果,摩擦时流畅感很强,而值为1时,受控物体就会像橡胶一样,与其发生摩擦的物体会有不流畅感。一般来说如果对摩擦力要求不是很高,动摩擦因子或者静摩擦因子调节为0.4即可。

(2)弹性因子的设定。

弹性因子的取值范围同样为0~1,当弹性因子取值为0,材质作用物体将不再拥有弹性,就像橡皮泥一样,被一个钢珠撞击时将不会有任何反弹,而是直接凹陷,能量被完全损耗。当弹性因子数值为1时,材质作用的物体就像钢珠一样,发生碰撞为完全弹性碰撞,没有能量的损耗。

(3)各向异性设定。

Unity中采用了这一概念,使开发者可以实现这一情景:当材质所附物体向某一特定方向运动时,运动非常流畅,而像其他方向运动时会很缓慢。

相关文章
|
6月前
|
图形学 索引
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱4(附带项目源码)
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱4(附带项目源码)
143 2
|
6月前
|
Rust 图形学
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
【unity实战】使用unity制作一个类似Rust的3D生存建造建筑系统,具有很好的吸附性(附项目源码)
166 1
|
6月前
|
图形学
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱10(附带项目源码)
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱10(附带项目源码)
70 1
|
6月前
|
图形学
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱8(附带项目源码)
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱8(附带项目源码)
53 1
|
6月前
|
图形学
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
134 0
|
6月前
|
图形学
【unity实战】3D水系统,游泳,潜水,钓鱼功能实现
【unity实战】3D水系统,游泳,潜水,钓鱼功能实现
200 0
|
6月前
|
图形学
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱12(附带项目源码)
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱12(附带项目源码)
79 0
|
6月前
|
图形学
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱7(附带项目源码)
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱7(附带项目源码)
41 0
|
6月前
|
存储 图形学
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱6(附带项目源码)
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱6(附带项目源码)
46 0
|
6月前
|
图形学
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱2(附带项目源码)
【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱2(附带项目源码)
46 0