Skip to content

导航系统与AI基础

unity-navigation-ai-basics-deep-dive

核心一句话

Unity 导航和 AI 要分开理解:

导航 Navigation:怎么走过去
AI:为什么走过去、什么时候追、什么时候打、什么时候回去

Unity 官方 AI Navigation 2.0.14 里,核心组件是:

c
NavMeshSurface:烘焙可走区域
NavMeshAgent:会寻路的角色
NavMeshObstacle:动态障碍物
NavMeshLink:跳跃、爬梯、跨沟等特殊连接
Area / Cost:不同区域的通行代价

1. NavMesh 是什么

NavMesh 就是“可行走区域网格”。

你可以把场景分成:

c
蓝色区域:AI 能走
空白区域:AI 不能走
特殊连接:AI 可以跳过去、爬过去、穿门过去

基本流程:

c
1. 安装 AI Navigation 包
2. 创建空物体 Navigation
3. 添加 NavMeshSurface
4. 设置哪些对象参与烘焙
5. 点击 Bake
6. 敌人身上添加 NavMeshAgent
7. 代码调用 SetDestination

2. NavMeshAgent 是什么

NavMeshAgent 是“会走路的 AI 角色组件”。

它负责:

c
算路径
沿路径移动
转弯
加速减速
避让其他 Agent
接近目标后停止

最简单追玩家:

c
using UnityEngine;
using UnityEngine.AI;

public class ChasePlayer : MonoBehaviour
{
    public Transform player;

    private NavMeshAgent agent;

    private void Awake()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    private void Update()
    {
        agent.SetDestination(player.position);
    }
}

SetDestination 会请求一条新路径。官方文档提醒:路径计算可能要等几帧,期间 pathPending 会是 true

3. 常用 Agent 参数

c
Speed:最大移动速度
Angular Speed:转向速度
Acceleration:加速度
Stopping Distance:离目标多近就停止
Auto Braking:接近目标时是否自动减速
Radius / Height:Agent 的身体尺寸
Obstacle Avoidance:避让质量和优先级
Area Mask:允许走哪些区域

巡逻时可以关掉 Auto Braking,移动会更顺。攻击时要设置合适的 Stopping Distance,不然敌人会挤到玩家脸上。

NavMeshObstacle 是“挡路的东西”:

箱子

移动平台上的障碍
可推动的物体

Carve 可以在 NavMesh 上挖洞,让 Agent 绕开。但不要大量移动物体都开 Carve,成本会高。

NavMeshLink 是“特殊通路”:

c
跳过沟
爬梯子
从高台跳下
门内外连接
两个 NavMeshSurface 之间连接

一句话:

c
Obstacle 让路变不可走。
Link 让本来不连通的路可以走。

5. AI 的基础结构

最适合零基础的是有限状态机 FSM

c
Patrol:巡逻
Chase:追击
Attack:攻击
Return:返回
Dead:死亡

敌人每帧做三件事:

c
感知:玩家在哪?距离多远?有没有墙挡住?
决策:现在该巡逻、追击还是攻击?
行为:调用 NavMeshAgent、动画、攻击代码

6. 巡逻-追击-攻击案例

c
using UnityEngine;
using UnityEngine.AI;

public class SimpleEnemyAI : MonoBehaviour
{
    enum State { Patrol, Chase, Attack }

    public Transform player;
    public Transform[] patrolPoints;
    public float sightRange = 8f;
    public float attackRange = 2f;

    private NavMeshAgent agent;
    private State state;
    private int patrolIndex;

    private void Awake()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    private void Update()
    {
        float distance = Vector3.Distance(transform.position, player.position);

        if (distance <= attackRange)
            state = State.Attack;
        else if (distance <= sightRange)
            state = State.Chase;
        else
            state = State.Patrol;

        if (state == State.Patrol) Patrol();
        if (state == State.Chase) Chase();
        if (state == State.Attack) Attack();
    }

    private void Patrol()
    {
        agent.isStopped = false;

        if (!agent.pathPending && agent.remainingDistance <= agent.stoppingDistance)
        {
            patrolIndex = (patrolIndex + 1) % patrolPoints.Length;
            agent.SetDestination(patrolPoints[patrolIndex].position);
        }
    }

    private void Chase()
    {
        agent.isStopped = false;
        agent.SetDestination(player.position);
    }

    private void Attack()
    {
        agent.isStopped = true;
        transform.LookAt(player);
        Debug.Log("Attack");
    }
}

这就是最小 AI 骨架:状态决定行为,Agent 负责走路。

7. 常见坑

c
忘记 Bake NavMesh,Agent 不动
Agent 不在 NavMesh 上,SetDestination 无效
Agent 半径太大,窄路走不过去
Stopping Distance 太小,敌人一直贴脸抖动
每帧疯狂 SetDestination 给大量敌人,性能浪费
NavMeshAgent 和非 Kinematic Rigidbody 同时控制移动,互相打架
Obstacle 开太多 Carve,运行时成本高
2D 项目照搬 3D NavMesh,效果别扭

学习路线

c
1. 会 Bake NavMesh
2. 会让 NavMeshAgent 走到指定点
3. 会做巡逻点 Patrol
4. 会做距离检测 Chase
5. 会做 Attack 停止移动
6. 会接 Animator,让速度驱动动画
7. 再学视野检测、NavMeshObstacle、NavMeshLink、Area Cost
8. 最后学行为树、Utility AI、GOAP

记住口诀:

c
NavMesh 是路。
Agent 会走路。
Obstacle 挡路。
Link 接特殊路。
感知找目标。
状态机决定行为。

参考:Unity 官方 AI NavigationNavMeshSurfaceNavMeshAgentNavMeshObstacleNavMeshLinkAreas and CostsSetDestination

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0