Appearance
导航系统与AI基础
核心一句话
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. 代码调用 SetDestination2. 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,不然敌人会挤到玩家脸上。
4. Obstacle 和 Link
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 Navigation、NavMeshSurface、NavMeshAgent、NavMeshObstacle、NavMeshLink、Areas and Costs、SetDestination。