Unity 3D 人形角色动画(Avatar)||Unity 3D 导航系统||Unity 3D 障碍物

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Unity 3D 人形角色动画Avatar

Mecanim 动画系统适合人形角色动画的制作人形骨架是在游戏中普遍采用的一种骨架结构。。

由于人形骨架在骨骼结构上的相似性用户可以将动画效果从一个人形骨架映射到另一个人形骨架从而实现动画重定向功能。

除了极少数情况之外人物模型均具有相同的基本结构即头部、躯干、四肢等。

Mecanim 动画系统正是利用这一点来简化骨架绑定和动画控制过程。

创建模型动画的一个基本步骤就是建立一个从 Mecanim 动画系统的简化人形骨架到用户实际提供的骨架的映射这种映射关系称为 Avatar

创建Avatar

在导入一个角色动画模型之后可以在 Import Settings 面板中的 Rig 选项下指定角色动画模型的动画类型包括 LegacyGeneric 以及 Humanoid 3 种模式。

  1. Legacy 与 Generic

Unity 3D 的 Mecanim 动画系统为非人形动画提供了两个选项Legacy旧版动画类型和 Generic一般动画类型

旧版动画使用 Unity 4.0 版本文前推出的动画系统。一般动画仍可由 Mecanim 系统导入但无法使用人形动画的专有功能。

非人形动画的使用方法是

  • 在 Assets 文件夹中选中模型文件。

  • 在 Inspector 视图中的 Import Settings 属性面板中选择 Rig 标签页

  • 单击 Animation Type 选项右侧的列表框选择 Generic 或 Legacy 动画类型即可。

  1. Humanoid

要使用 Humanoid人形动画单击 Animation Type 右侧的下拉列表选择 Humanoid然后单击 Apply 按钮Mecanim 动画系统会自动将用户所提供的骨架结构与系统内部自带的简易骨架进行匹配。

如果匹配成功Avatar Definition 下的 Configure 复选框会被选中同时在 Assets 文件夹中一个 Avatar 子资源会被添加到模型资源中。

配置Avatar

Unity 3D 中的 Avatar 是 Mecanim 动画系统中极为重要的模块正确地设置 Avatar 非常重要。

不管 Avatar 的自动创建过程是否成功用户都需要到 Configure Avatar 界面中确认 Avatar 的有效性即确认用户提供的骨骼结构与 Mecanim 预定义的骨骼结构已经正确地匹配起来并已经处于 T 形姿态

单击 Configure 按钮后编辑器会要求保存当前场景因为在 Configure 模式下可以看到 Scene 视图而不是 Game 视图中显示出当前选中模型的骨骼、肌肉、动画信息以及相关参数。

在这个视图中实线圆圈表示的是 Avatar 必须匹配的而虚线圆圈表示的是可选匹配的。

人形动画重定向

在 Mecanim 动画系统中人形动画的重定向功能是非常强大的因为这意味着用户只要通过很简单的操作就可以将一组动画应用到各种各样的人形角色上。

由于动画重定向功能只能应用到人形模型上所以为了保证应用后的动画效果必须正确地配置Avatar

Unity 3D 导航系统 

过去游戏开发者必须自己打造寻路系统特别是在基于节点的寻路系统中必须手动地在 AI 使用的点之间进行导航因此基于节点系统的寻路非常烦琐。

Unity 3D 不仅具有导航功能还使用了导航网格navigation meshes这比手动放置节点更有效率而且更流畅。

更重要的是还可以一键重新计算整个导航网格彻底摆脱了手动修改导航节点的复杂方法。

1) 设置 NavMesh

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

2) 烘焙

执行菜单 Window→Navation 命令打开导航窗口单击右下角的 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 SizeRadius设置导航代理的半径
Height设置导航代理的高度
Base Offset设置圆柱体相对于本地坐标的偏移
SteeringSpeed设置最大移动速度
Angular Speed设置最大角速度
Acceleration设置最大加速度
Stopping Distance设置离目标距离还有多远时停止
Auto Braking激活时到达目标位置前将减速
Obstacle AvoidanceQuality设置躲避障碍物的质量如果设置为0则不躲避其他导航 代理
Priority设置自身的导航优先级范围是0〜99值越小优先级 越大
Path FindingAuto Traverse Off Mesh Link设置是否采用默认方式经过链接路径
Auto Repath设置当现有的路径变为无效时是否尝试获取一个新的路径
Area Mask设置此导航代理可以行走哪些区域类型

实践案例自动寻路

案例构思

使用 Unity 3D 开发游戏自动寻路可以有很多种实现方式。A 星寻路是一种比较传统的人工智能算法在游戏开发中比较常用。

另外Unity 3D 官方内置的寻路插件 Navmesh 也可以实现自动寻路功能。

本案例旨在通过一个简单的三维场景漫游实现 Navmesh 自动寻路插件的使用。

案例设计

本案例在 Unity 3D 内创建一个简单的三维场景场景内有各种障碍通过 Navmesh 插件可以自动寻找到目标位置。

案例实施

步骤 1)新建三维场景将其命名为 Navigation。其中胶囊体作为动态移动的对象球体作为导航的目标

步骤 2)选中场景中所有除了 sphere、cylinder 摄像机以及直线光以外的所有物体单击 Inspector 面板中右上角的 Navigation Static使这些物体成为静态物体并设置成 Navigation Static 类型如下图所示。 

步骤 3)执行菜单栏中的 Window→Navigation 命令Navigation 面板

步骤 4)单击该面板右下角的 Bake 按钮即可生成导航网格

步骤 5)下面就可以让一个胶囊体根据一个导航网格运动到目标 Sphere 位置。执行 Component→Navigation→Nav Mesh Agent 为该胶囊体挂载一个 Nav Mesh Agent

步骤 6)最后写一个脚本就可以实现自动寻路了。创建 C# 脚本将其命名为 DemoNavigation脚本如下 纯文本复制

 
  1. using UnityEngine;
  2. using System.Collections;
  3. public class DemoNavigation:MonoBehaviour{
  4. public Transform target;
  5. void Start(){
  6. if(target!=null){
  7. this.gameObject.GetComponent<NavMeshAgent>().destination=target.position;
  8. }
  9. }
  10. }

步骤 7)脚本新建完成后挂载到胶囊体上然后将 Sphere 赋予胶囊体的 Navigation 脚本运行场景如下图所示胶囊体会运动到 Sphere 的位置。

Unity 3D 障碍物

Nav Mesh Obstacle 一般来说不可攀爬的 Nav Mesh 都被视为障碍物Nav Mesh Obstacle也可以直接将物体设为障碍物即可以为游戏对象添加 Nav Mesh Obstacle 组件。

有别于普通的 Nav MeshNav Mesh Obstacle 是一种不需要烘焙的障碍物形状可以选择为立方体或胶囊体。

实践案例障碍物绕行

案例构思

在自动寻路过程中往往会遇到障碍物在寻路过程中遇到障碍物要怎样解决呢

Unity 官方内置的寻路插件 Navmesh 完美地解决了这个问题。

本案例通过一个简单的有障碍的场景实现自动寻路中障碍物绕行功能。

案例设计

本案例在 Unity 3D 内创建一个有障碍的场景场景内有一个 Cube 用来充当障碍物通过 Navmesh 插件实现主角遇到障碍物时自动绕行效果。 案例实施 步骤 1)执行 File→Save Scene as 命令将 Navigation 场景另存为 Obstacle 场景如下图所示。

 步骤 2)执行 GameObject→3D Object→Cube 命令新建一个障碍物将其放置在主角的前方并赋予黑色材质如下图所示。

步骤 3)执行 Component→Navigation→Nav Mesh Obstacle 命令添加 Nav Mesh Obstacle 组件如下图所示。

步骤 4)单击 Play 按钮进行测试可以发现主角会绕过黑色立方体并到达终点效果如下图所示。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6