前言:

这篇是简单介绍Unity的几个常见碰撞器、刚体、以及角色控制器、导航系统

 

 

 

 


碰撞器:

Unity中存在这么几种碰撞器,可以检测物体与物体之间的碰撞,当游戏对象中的 Rigidbody 碰撞体组件被添加后,其属性面板中会显示相应的属性设置选项,每种碰撞体的资源类型稍有不同,具体如下

unity把人撞飞 unity人物碰撞器_ide

1) Box Collider

Box Collider 是最基本的碰撞体,Box Collider 是一个立方体外形的基本碰撞体。

一般游戏对象往往具有 Box Collider 属性,如墙壁、门、墙以及平台等,也可以用于布娃娃的角色躯干或者汽车等交通工具的外壳,当然最适合用在盒子或是箱子上。

下图所示是 Box Collider,游戏对象一旦添加了 Box Collider 属性,则在 Inspector 面板中就会出现对应的 Box Collider 属性参数设置,具体参数如下表所示。

unity把人撞飞 unity人物碰撞器_unity_02

参 数

含 义

功 能

Is Trigger

触发器

勾选该项,则该碰撞体可用于触发事件,并将被物理引擎所忽略

Material

材质

为碰撞体设置不同类型的材质

Center

中心

碰撞体在对象局部坐标中的位置

Size

大小

碰撞体在X、Y、Z方向上的大小

如果 Is Trigger 选项被勾选,该对象一旦发生碰撞动作,则会产生 3 个碰撞信息并发送给脚本参数,分别是 OnTriggerEnter、OnTriggerExit、OnTriggerStay。

Physics Material 定义了物理材质,包括冰、金属、塑料、木头等。

2) Sphere Collider

Sphere Collider 是球体形状的碰撞体,如下图所示。

unity把人撞飞 unity人物碰撞器_标签页_03

Sphere Collider 是一个基于球体的基本碰撞体,Sphere Collider 的三维大小可以按同一比例调节,但不能单独调节某个坐标轴方向的大小,具体参数如下表所示。

当游戏对象的物理形状是球体时,则使用球体碰撞体,如落石、乒乓球等游戏对象。

参 数

含 义

功 能

Is Trigger

触发器

勾选该项,则该碰撞体可用于触发事件,并将被物理引擎所忽略

Material

材质

用于为碰撞体设置不同的材质

Center

中心

设置碰撞体在对象局部坐标中的位置

Radius

半径

设置球形碰撞体的大小

3) Capsule Collider

Capsule Collider 由一个圆柱体盒两个半球组合而成,Capsule Collider 的半径和高度都可以单独调节,可用在角色控制器或与其他不规则形状的碰撞结合来使用。

通常添加至 Character 或 NPC 等对象的碰撞属性,如下图所示,具体参数如下表所示。

unity把人撞飞 unity人物碰撞器_ide_04

 

选项英文名称

选项中文名称

功能详解

Is Trigger

触发器

勾选该项,则该碰撞体可用于触发事件,并将被物理引擎所忽略

Material

材质

用于为碰撞体设置不同的材质

Center

中心

设置碰撞体在对象局部坐标中的位置

Radius

半径

设置碰撞体的大小

Height

局度

控制碰撞体中圆柱的高度

Direction

方向

设置在对象的局部坐标中胶囊体的纵向所对应的坐标轴,默认是Y轴

4) Mesh Collider

Mesh Collider(网格碰撞体)根据 Mesh 形状产生碰撞体,比起 Box Collider、Sphere Collider 和 Capsule Collider,Mesh Collider 更加精确,但会占用更多的系统资源。

专门用于复杂网格所生成的模型,如下图所示,具体参数如下表所示。

unity把人撞飞 unity人物碰撞器_标签页_05

参 数

含 义

功 能

Convex

凸起

勾选该项,则Mesh Collider将会与其他的Mesh Collider发生碰撞

Material

材质

用于为碰撞体设置不同的材质

Mesh

网格

获取游戏对象的网格并将其作为碰撞体

 5) Wheel Collider

Wheel Collider(车轮碰撞体)是一种针对地面车辆的特殊碰撞体,自带碰撞侦测、轮胎物理现象和轮胎模型,专门用于处理轮胎,如下图所示,具体参数如下表所示。

unity把人撞飞 unity人物碰撞器_ide_06

参 数

含 义

功 能

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 属性面板会显示相应的属性参数与功能选项,具体内容如下表所示。

unity把人撞飞 unity人物碰撞器_标签页_07

参 数

含义

功 能

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 中的角色控制器组件被添加到角色上之后,其属性面板会显示相应的属性参数,如下图所示,其参数如下表所示。

unity把人撞飞 unity人物碰撞器_标签页_08

参 数

含 义

功 能

Slope Limit

坡度限制

设置被控制的角色对象爬坡的高度

Step Offset

台阶高度

设置所控制角色对象可以迈上的最大台阶高度值

Skin Width

皮肤厚度

决定两个碰撞体碰撞后相互渗透的程度

Min Move Distance

最小移动距离

设置角色对象最小移动值

Center

中心

设置胶囊碰撞体在世界坐标中的位置

Radius

半径

设置胶囊碰撞体的横截面半径

Height

高度

设置胶囊碰撞体的高度

 


Navigation 导航系统

Navigation(导航)是用于实现动态物体自动寻路的一种技术,它将游戏场景中复杂的结构关系简化为带有一定信息的网格,并在这些网格的基础上通过一系列相应的计算来实现自动寻路。

1) 设置 NavMesh

NavMesh 的设置方法很简单,在 Hierarchy 视图中选中场景中除了目标和主角以外的游戏对象,在 Inspector 视图中单击 Static 下拉列表,在其中勾选 Navigation Static 即可,如下图所示。

unity把人撞飞 unity人物碰撞器_ide_09

2) 烘焙

执行菜单 Window→Navigation 命令,打开导航窗口,单击右下角的 Bake(烘焙)按钮即可,烘焙后的场景如下图所示。

unity把人撞飞 unity人物碰撞器_unity_10

接下来详细看看 Navigation 面板,它有 Object、Bake、Areas 这 3 个标签页。

其中,Object 标签页如下图所示,该标签页可以设置游戏对象的参数,如下表所示。当选取游戏对象后,可以在此标签页中设置导航相关参数。

unity把人撞飞 unity人物碰撞器_ide_11

参 数

功 能

Navigation Static

勾选后表示该对象参与导航网格的烘焙

Generate OffMeshLinks

勾选后可在导航网格中跳跃(Jump)和下落(Drop)

Navigation Area

导航区域

Bake 标签页如下图所示,是 Navigation 面板最重要的标签页,在该标签页下可以设置导航代理相关参数以及烘焙相关参数,参数说明如下表所示。

unity把人撞飞 unity人物碰撞器_unity_12

参 数

功 能

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 面板中各导航代理参数含义如下表所示。

unity把人撞飞 unity人物碰撞器_物理引擎_13

属性分区

参 数

功 能

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

设置此导航代理可以行走哪些区域类型

干看上面的例子可能不太好操作,我来说一下我现在做的小游戏用到的操作:

  1. 选中挂载 Mesh Renderer  的物体(一般是地面),然后适当调整参数后,在Bake中烘焙
  2. 给导航代理(自动找路者)挂载组件——Nav Mesh Agent
  3. 编写代码:
transform = GetComponent<Transform>();
        // 获取主角
        player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
        // 获取寻路组件
        agent = GetComponent<NavMeshAgent>();
        // 指定寻路器的行走速度
        agent.speed = moveSpeed;
        // 设置寻路目标
        agent.SetDestination(player.transform.position);

我这里是在编写一个僵尸自动找主角