前言:
这篇是简单介绍Unity的几个常见碰撞器、刚体、以及角色控制器、导航系统
碰撞器:
Unity中存在这么几种碰撞器,可以检测物体与物体之间的碰撞,当游戏对象中的 Rigidbody 碰撞体组件被添加后,其属性面板中会显示相应的属性设置选项,每种碰撞体的资源类型稍有不同,具体如下
1) Box Collider
Box Collider 是最基本的碰撞体,Box Collider 是一个立方体外形的基本碰撞体。
一般游戏对象往往具有 Box Collider 属性,如墙壁、门、墙以及平台等,也可以用于布娃娃的角色躯干或者汽车等交通工具的外壳,当然最适合用在盒子或是箱子上。
下图所示是 Box Collider,游戏对象一旦添加了 Box Collider 属性,则在 Inspector 面板中就会出现对应的 Box Collider 属性参数设置,具体参数如下表所示。
参 数 | 含 义 | 功 能 |
Is Trigger | 触发器 | 勾选该项,则该碰撞体可用于触发事件,并将被物理引擎所忽略 |
Material | 材质 | 为碰撞体设置不同类型的材质 |
Center | 中心 | 碰撞体在对象局部坐标中的位置 |
Size | 大小 | 碰撞体在X、Y、Z方向上的大小 |
如果 Is Trigger 选项被勾选,该对象一旦发生碰撞动作,则会产生 3 个碰撞信息并发送给脚本参数,分别是 OnTriggerEnter、OnTriggerExit、OnTriggerStay。
Physics Material 定义了物理材质,包括冰、金属、塑料、木头等。
2) Sphere Collider
Sphere Collider 是球体形状的碰撞体,如下图所示。
Sphere Collider 是一个基于球体的基本碰撞体,Sphere Collider 的三维大小可以按同一比例调节,但不能单独调节某个坐标轴方向的大小,具体参数如下表所示。
当游戏对象的物理形状是球体时,则使用球体碰撞体,如落石、乒乓球等游戏对象。
参 数 | 含 义 | 功 能 |
Is Trigger | 触发器 | 勾选该项,则该碰撞体可用于触发事件,并将被物理引擎所忽略 |
Material | 材质 | 用于为碰撞体设置不同的材质 |
Center | 中心 | 设置碰撞体在对象局部坐标中的位置 |
Radius | 半径 | 设置球形碰撞体的大小 |
3) Capsule Collider
Capsule Collider 由一个圆柱体盒两个半球组合而成,Capsule Collider 的半径和高度都可以单独调节,可用在角色控制器或与其他不规则形状的碰撞结合来使用。
通常添加至 Character 或 NPC 等对象的碰撞属性,如下图所示,具体参数如下表所示。
选项英文名称 | 选项中文名称 | 功能详解 |
Is Trigger | 触发器 | 勾选该项,则该碰撞体可用于触发事件,并将被物理引擎所忽略 |
Material | 材质 | 用于为碰撞体设置不同的材质 |
Center | 中心 | 设置碰撞体在对象局部坐标中的位置 |
Radius | 半径 | 设置碰撞体的大小 |
Height | 局度 | 控制碰撞体中圆柱的高度 |
Direction | 方向 | 设置在对象的局部坐标中胶囊体的纵向所对应的坐标轴,默认是Y轴 |
4) Mesh Collider
Mesh Collider(网格碰撞体)根据 Mesh 形状产生碰撞体,比起 Box Collider、Sphere Collider 和 Capsule Collider,Mesh Collider 更加精确,但会占用更多的系统资源。
专门用于复杂网格所生成的模型,如下图所示,具体参数如下表所示。
参 数 | 含 义 | 功 能 |
Convex | 凸起 | 勾选该项,则Mesh Collider将会与其他的Mesh Collider发生碰撞 |
Material | 材质 | 用于为碰撞体设置不同的材质 |
Mesh | 网格 | 获取游戏对象的网格并将其作为碰撞体 |
5) Wheel Collider
Wheel Collider(车轮碰撞体)是一种针对地面车辆的特殊碰撞体,自带碰撞侦测、轮胎物理现象和轮胎模型,专门用于处理轮胎,如下图所示,具体参数如下表所示。
参 数 | 含 义 | 功 能 |
Mass | 质量 | 用于设置 Wheel Collider 的质量 |
Radius | 半径 | 用于设置碰撞体的半径大小 |
Wheel Damping Rate | 车轮减震率 | 用于设置碰撞体的减震率 |
Suspension Distance | 悬挂距离 | 该项用于设置碰撞体悬挂的最大伸长距离,按照局部坐标来计算, 悬挂总是通过其局部坐标的 Y 轴延伸向下 |
Center | 中心 | 用于设置碰撞体在对象局部坐标的中心 |
Suspension Spring | 悬挂弹簧 | 用于设置碰撞体通过添加弹簧和阻尼外力使得悬挂达到目标位置 |
Forward Friction | 向前摩擦力 | 当轮胎向前滚动时的摩擦力属性 |
Sideways Friction | 侧向摩擦力 | 当轮胎侧向滚动时的摩擦力属性 |
Rigidbody(刚体)
Unity 3D 中的 Rigidbody(刚体)可以为游戏对象赋予物理属性,使游戏对象在物理系统的控制下接受推力与扭力,从而实现现实世界中的运动效果。
在游戏制作过程中,只有为游戏对象添加了刚体组件,才能使其受到重力影响。
刚体是物理引擎中最基本的组件。在物理学中,刚体是一个理想模型。
通常把在外力作用下,物体的形状和大小(尺寸)保持不变,而且内部各部分相对位置保持恒定(没有形变)的理想物理模型称为刚体。
在一个物理引擎中,刚体是非常重要的组件,通过刚体组件可以给物体添加一些常见的物理属性,如质量、摩擦力、碰撞参数等。
通过这些属性可以模拟该物体在 3D 世界内的一切虚拟行为,当物体添加了刚体组件后,它将感应物理引擎中的一切物理效果。
Unity 3D 提供了多个实现接口,开发者可以通过更改这些参数来控制物体的各种物理状态。
刚体在各种物理状态影响下运动,刚体的属性包含 Mass(质量)、Drag(阻力)、Angular Drag(角阻力)、Use Gravity(是否使用重力)、Is Kinematic(是否受物理影响)、Collision Detection(碰撞检测)等。
刚体选项设置
如下图所示,游戏对象一旦被赋予刚体属性后,其 Inspector 属性面板会显示相应的属性参数与功能选项,具体内容如下表所示。
参 数 | 含义 | 功 能 |
Mass | 质量 | 物体的质量(任意单位)。建议一个物体的质量不要与其他物体 相差100倍 |
Drag | 阻力 | 当受力移动时物体受到的空气阻力。0表示没有空气阻力,极 大时使物体立即停止运动 |
Angular Drag | 角阻力 | 当受扭力旋转时物体受到的空气阻力。0表示没有空气阻力, 极大时使物体立即停止旋转 |
Use Gravity | 使用重力 | 该物体是否受重力影响,若激活,则物体受重力影响 |
Is Kinematic | 是否是运动学 | 游戏对象是否遵循运动学物理定律,若激活,该物体不再受物理 引擎驱动,而只能通过变换来操作。适用于模拟运动的平台或 者模拟由铰链关节连接的刚体 |
Interpolate | 插值 | 物体运动插值模式。当发现刚体运动时抖动,可以尝试下面的 选项:None(无),不应用插值;Interpolate(内插值),基于上一巾贞 变换来平滑本帧变换;Extrapolate(外插值),基于下一帧变换来 平滑本帧变换 |
Collision Detection | 碰撞检测 | 碰撞检测模式。用于避免高速物体穿过其他物体却未触发碰 撞。碰撞模式包括Discrete (不连续)、Continuous (连续)、 Continuous Dynamic (动态连续〉3种。其中,Discrete模式用来 检测与场景中其他碰撞器或其他物体的碰撞;Continuous模式 用来检测与动态碰撞器(刚体)的碰撞;Continuous Dynamic模 式用来检测与连续模式和连续动态模式的物体的碰撞,适用于 高速物体 |
Constraints | 约束 | 对刚体运动的约束。其中,Freeze Position(冻结位置)表7TC刚体 在世界中沿所选HZ轴的移动将无效,Freeze Rotation(冻结 旋转)表示刚体在世界中沿所选的X、Y、Z轴的旋转将无效 |
角色控制器
在 Unity 3D 中,游戏开发者可以通过角色控制器来控制角色的移动,角色控制器允许游戏开发者在受制于碰撞的情况下发生移动,而不用处理刚体。
角色控制器不会受到力的影响,在游戏制作过程中,游戏开发者通常在任务模型上添加角色控制器组件进行模型的模拟运动。
角色控制器选项设置
Unity 3D 中的角色控制器组件被添加到角色上之后,其属性面板会显示相应的属性参数,如下图所示,其参数如下表所示。
参 数 | 含 义 | 功 能 |
Slope Limit | 坡度限制 | 设置被控制的角色对象爬坡的高度 |
Step Offset | 台阶高度 | 设置所控制角色对象可以迈上的最大台阶高度值 |
Skin Width | 皮肤厚度 | 决定两个碰撞体碰撞后相互渗透的程度 |
Min Move Distance | 最小移动距离 | 设置角色对象最小移动值 |
Center | 中心 | 设置胶囊碰撞体在世界坐标中的位置 |
Radius | 半径 | 设置胶囊碰撞体的横截面半径 |
Height | 高度 | 设置胶囊碰撞体的高度 |
Navigation 导航系统
Navigation(导航)是用于实现动态物体自动寻路的一种技术,它将游戏场景中复杂的结构关系简化为带有一定信息的网格,并在这些网格的基础上通过一系列相应的计算来实现自动寻路。
1) 设置 NavMesh
NavMesh 的设置方法很简单,在 Hierarchy 视图中选中场景中除了目标和主角以外的游戏对象,在 Inspector 视图中单击 Static 下拉列表,在其中勾选 Navigation Static 即可,如下图所示。
2) 烘焙
执行菜单 Window→Navigation 命令,打开导航窗口,单击右下角的 Bake(烘焙)按钮即可,烘焙后的场景如下图所示。
接下来详细看看 Navigation 面板,它有 Object、Bake、Areas 这 3 个标签页。
其中,Object 标签页如下图所示,该标签页可以设置游戏对象的参数,如下表所示。当选取游戏对象后,可以在此标签页中设置导航相关参数。
参 数 | 功 能 |
Navigation Static | 勾选后表示该对象参与导航网格的烘焙 |
Generate OffMeshLinks | 勾选后可在导航网格中跳跃(Jump)和下落(Drop) |
Navigation Area | 导航区域 |
Bake 标签页如下图所示,是 Navigation 面板最重要的标签页,在该标签页下可以设置导航代理相关参数以及烘焙相关参数,参数说明如下表所示。
参 数 | 功 能 |
Agent Radius | 设置具有代表性的物体半径,半径越小,生成的网格面积越大 |
Agent Height | 设置具有代表性的物体的高度 |
Max Slope | 设置斜坡的坡度 |
Step Height | 设置台阶高度 |
Drop Height | 设置允许最大的下落距离 |
Jump Distance | 设置允许最大的跳跃距离 |
Manual Voxel Size | 设置是否手动调整烘焙尺寸 |
Voxel Size | 设置烘焙的单元尺寸,控制烘焙的精度 |
Min Region Area | 设置最小区域 |
Height Mesh | 设置当地形有落差时是否生成精确而不是近似的烘焙效果 |
3) 设置导航代理
导航代理(Navigation Agent)可以理解为去寻路的主体。
在导航网格生成之后,给游戏对象添加了一个 Nav Mesh Agent 组件,如下图所示。
Nav Mesh Agent 面板中各导航代理参数含义如下表所示。
属性分区 | 参 数 | 功 能 |
Agent Size | Radius | 设置导航代理的半径 |
Height | 设置导航代理的高度 | |
Base Offset | 设置圆柱体相对于本地坐标的偏移 | |
Steering | Speed | 设置最大移动速度 |
Angular Speed | 设置最大角速度 | |
Acceleration | 设置最大加速度 | |
Stopping Distance | 设置离目标距离还有多远时停止 | |
Auto Braking | 激活时,到达目标位置前将减速 | |
Obstacle Avoidance | Quality | 设置躲避障碍物的质量,如果设置为0则不躲避其他导航 代理 |
Priority | 设置自身的导航优先级,范围是0〜99,值越小,优先级 越大 | |
Path Finding | Auto Traverse Off Mesh Link | 设置是否采用默认方式经过链接路径 |
Auto Repath | 设置当现有的路径变为无效时是否尝试获取一个新的路径 | |
Area Mask | 设置此导航代理可以行走哪些区域类型 |
干看上面的例子可能不太好操作,我来说一下我现在做的小游戏用到的操作:
- 选中挂载 Mesh Renderer 的物体(一般是地面),然后适当调整参数后,在Bake中烘焙
- 给导航代理(自动找路者)挂载组件——Nav Mesh Agent
- 编写代码:
transform = GetComponent<Transform>();
// 获取主角
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
// 获取寻路组件
agent = GetComponent<NavMeshAgent>();
// 指定寻路器的行走速度
agent.speed = moveSpeed;
// 设置寻路目标
agent.SetDestination(player.transform.position);
我这里是在编写一个僵尸自动找主角