第9章 Unity3D智能寻路导航

Unity3D Navigation System

虚拟现实技术与开发

实现AI自动寻路与智能导航

本章内容概览

导航系统基础

  • 导航系统概述
  • NavMesh导航网格
  • NavMeshAgent代理

核心组件

  • Off-Mesh Link离网链接
  • NavMeshObstacle障碍物

实践应用

  • 创建导航网格
  • 设置寻路代理
  • 编写寻路脚本
  • 结合动画状态机

9.1 导航系统概述

导航系统:游戏开发中实现AI自动寻路的关键技术,让NPC智能移动

Unity导航系统组成

组件 功能
NavMesh 导航网格,表示可行走区域
NavMeshAgent 导航代理,执行寻路
Off-Mesh Link 离网链接,实现跳跃、爬高
NavMeshObstacle 动态障碍物

导航系统特点

9.1.1 NavMesh导航网格

NavMesh:Unity自动生成的导航网格,表示可行走区域

创建导航网格步骤

  1. 选中场景中的地面/平台物体
  2. Inspector → Static下拉菜单
  3. 勾选Navigation Static

烘焙参数

参数 说明
Agent Radius 代理半径(可行走区域宽度)
Agent Height 代理高度(可行走区域高度)
Max Slope 最大坡度
Step Height 台阶高度

9.1.2 NavMeshAgent导航代理

NavMeshAgent:挂载在需要寻路的角色上,执行自动寻路

添加代理

选中角色 → Component → Navigation → NavMeshAgent

主要属性

属性 说明
Speed 移动速度
Angular Speed 转向速度
Acceleration 加速度
Stopping Distance 停止距离(到达目标前停止)
Auto Braking 自动制动
Radius 代理半径
Height 代理高度

9.1.3 编写寻路脚本

设置目标点

using UnityEngine;
using UnityEngine.AI;

public class PlayerMove : MonoBehaviour {
    private NavMeshAgent agent;
    public Transform target; // 目标点

    void Start() {
        agent = GetComponent<NavMeshAgent>();
        agent.SetDestination(target.position);
    }
}

点击移动

void Update() {
    if (Input.GetMouseButtonDown(0)) {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit)) {
            agent.SetDestination(hit.point);
        }
    }
}

9.1.4 结合动画状态机

寻路与动画联动

public class PlayerMove : MonoBehaviour {
    private NavMeshAgent agent;
    private Animator anim;

    void Start() {
        agent = GetComponent<NavMeshAgent>();
        anim = GetComponent<Animator>();
    }

    void Update() {
        // 设置speed参数控制动画
        anim.SetFloat("speed", agent.velocity.magnitude);
    }
}

动画状态机设置

9.2 Off-Mesh Link离网链接

Off-Mesh Link:实现跳跃、爬高等非常规路径

使用场景

创建步骤

  1. GameObject → Create Empty
  2. Component → Navigation → Off Mesh Link
  3. 设置Start Point和End Point
  4. 调整Cost Override(代价)

参数说明

9.3 NavMeshObstacle动态障碍物

NavMeshObstacle:动态障碍物,代理会自动绕行

添加障碍物

选中物体 → Component → Navigation → NavMesh Obstacle

主要属性

属性 说明
Shape 形状(Capsule/Box)
Center 中心点
Size 大小
Carve 是否切割导航网格
Move Threshold 移动阈值
Time To Stationary 静止时间

9.3.1 Carve模式详解

普通模式 vs Carve模式

模式 特点
普通模式 代理绕行,障碍物移动时重新计算路径
Carve模式 实时切割导航网格,性能开销更大

Carve适用场景

性能建议:静态障碍物使用Navigation Static,动态障碍物使用NavMeshObstacle

9.4 综合实例:点击移动

场景搭建

  1. 创建Plane作为地面
  2. 创建Cube作为障碍物
  3. 导入角色模型

设置导航

  1. Plane和Cube勾选Navigation Static
  2. Window → Navigation → Bake烘焙
  3. 角色添加NavMeshAgent组件

编写脚本

// 点击地面移动角色
if (Input.GetMouseButtonDown(0)) {
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray, out hit)) {
        agent.SetDestination(hit.point);
    }
}

本章小结

重点掌握

  • 导航系统组成
  • NavMesh创建与烘焙
  • NavMeshAgent属性设置
  • SetDestination设置目标
  • 寻路与动画结合

了解拓展

  • Off-Mesh Link使用
  • NavMeshObstacle设置
  • Carve模式
  • 寻路性能优化

思考题:简述Unity导航系统组成及各组件功能

答案:NavMesh(导航网格)、NavMeshAgent(导航代理)、Off-Mesh Link(离网链接)、NavMeshObstacle(动态障碍物)