Unity中的Navigation导航系统介绍
Unity NavMesh系统包含以下部分:
- NavMesh(导航网格的简称) Unity自动构建的文件。
- NavMesh Agent组件 添加到角色身上,控制角色朝向目标移动,避免彼此的角色碰撞
- Off-Mesh Link 组件 允许角色在指定俩物体上的网格跳越
- NavMesh Obstacle 组件 添加到障碍身上。角色会绕过障碍物
NavMesh
所有标记为导航静态(Navigation)的游戏对象才可以生成NavMesh
在Unity中,NavMesh生成从导航窗口处理(菜单:Window > AI > Navigation)。
为场景
- 构建NavMesh 可以通过几个步骤完成:
选择构建地形的物体设置为Navigation Static - 调整Navigation窗口Bake设置(agent 是角色)
- Agent Radius定义agent 的中心与墙壁或壁架的接近程度。
- Agent Height定义agent 可以达到的空间的低度。
- Max Slope定义了agent 人走上坡道的陡峭程度。
- Step Height 可定义agent 可以踩踏的障碍物的高度。
- 单击Bake以构建NavMesh。
构建出来的导航网格在编辑场景中显示为蓝色(在游戏场景中是不会显示的)
烘焙完成后,在文件夹中有一个NavMesh文件,该文件与NavMesh所属的场景同名。例如,如果在Assets文件夹中有一个名为First Level的场景,则NavMesh将位于Assets> First Level> NavMesh.asset。
NavMesh Agent组件
在场景中新建一个胶囊体作为角色,为其添加NavMeshAgen组件,再新建一个脚本(PalyerMovement.cs )控制角色移动,挂在角色上,脚本内容如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class PalyerMovement : MonoBehaviour {
private NavMeshAgent agent;
void Start()
{
//获取角色上的NavMeshAgent组件
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
//鼠标左键
if (Input.GetMouseButtonDown(0))
{
//射线检测
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
bool isCollider = Physics.Raycast(ray, out hit);
if (isCollider)
{
//hit.point射线触碰的Position
//SetDestination设置下一步的位置
agent.SetDestination(hit.point);
}
}
}
}
运行场景测试移动
手册还有很多API,下面介绍NavMeshAgent组件常用属性
Agent Size
当我们给角色添加NavMeshAgent组件时,角色上会有一个圆柱形的线框这不是collider,它是用来计算agent寻路,避开障碍物的
Radius,Height,控制它的半斤,高度,Base offset 设置基础偏移
Steering
设置角色移动
Speed 移速度
Angular Speed 角速度
Acceleration 加速度
StoppingDistance 到目标前的暂停距离
Auto Braking 是否自动暂停
Nav Mesh Obstacle
Shape 形状矩形/胶囊
Center 形状的中心点
Size 形状的大小
Carve 勾选Carve 后,Nav Mesh Obstacle会在NavMesh中创建一个洞。
CarveOnlyStation启用后,只有在静止时才会烘焙障碍物。
Off-Mesh Link
Start起始位置的对象。
End结束位置的对象。
CostOverride 耗费 -1表示耗费0,是正数的话,如果值为3,则在离网格链接上移动将比的默认NavMesh 上移动相同距离要多耗费3倍的区域。
BiDirectional 如果启用,则可以在任一方向上跳跃。否则,它只能从Start到End遍历
Activated 是否**此链接
Auto Update Positions启用后,当终点移动时,Off-Mesh链接将重新连接到NavMesh。如果禁用,即使移动了端点,链接也将保持在其起始位置。
我把测试用的场景打包到百度云了,我的Unity是2017.2.4版
链接:https://pan.baidu.com/s/11Of5GXlS7pQMl5cnOPeq5w
提取码:ovnk