Appearance
导航与AI基础
先分清两个概念
导航 负责: NPC 怎么从 A 点走到 B 点。
AI 负责: NPC 为什么要走、什么时候追、什么时候巡逻、什么时候攻击。
所以你可以先记住:
AI = 感知 + 决策 + 导航 + 行动
导航系统 = NavMesh + NavMeshAgent + Obstacle + Link + Area1. NavMesh:可行走地图
NavMesh 可以理解成 Unity 给 NPC 用的“蓝色可走地图”。
场景里的地面、楼梯、平台、障碍物,对 NPC 来说太复杂。 Unity 会先把它们烘焙成一张简单的可行走区域。
真实场景
↓ Bake
NavMesh 蓝色可走区域
↓
NPC 在上面找路NPC 通常不能随便在空气、墙里、悬崖外走。 它只能在 NavMesh 上移动。
2. NavMesh Surface:生成 NavMesh 的组件
NavMesh Surface 负责烘焙 NavMesh。
流程是:
选择场景地面
添加 NavMesh Surface
设置 Agent 类型
点击 Bake
生成蓝色可走区域如果没有 Bake,NPC 就没有“地图”,自然不知道怎么走。
3. NavMeshAgent:会走路的 NPC
NavMeshAgent 挂在敌人、怪物、村民、宠物这些会移动的角色身上。
它负责:
- 找路
- 沿路径移动
- 转向
- 停在目标附近
- 避开其他 Agent
- 尝试绕开障碍
常见参数:
| 参数 | 作用 |
|---|---|
| Speed | 最大移动速度 |
| Angular Speed | 转身速度 |
| Acceleration | 加速度 |
| Stopping Distance | 离目标多近就停下 |
| Radius | 角色占地半径 |
| Height | 角色高度 |
| Auto Braking | 接近目标时是否减速 |
| Area Mask | 允许走哪些区域 |
最小追击逻辑:
using UnityEngine;
using UnityEngine.AI;
public class ChasePlayer : MonoBehaviour
{
public Transform player;
private NavMeshAgent agent;
void Awake()
{
agent = GetComponent<NavMeshAgent>();
}
void Update()
{
agent.SetDestination(player.position);
}
}这段代码的意思是: 每帧告诉 Agent:“去玩家现在的位置。”
4. Obstacle / Link / Area
| 名称 | 作用 | 例子 |
|---|---|---|
| NavMeshObstacle | 动态障碍 | 箱子、门、车辆、可推动物体 |
| NavMeshLink | 连接断开的路 | 跳跃、上下平台、过桥、进门 |
| Areas and Costs | 控制路线偏好 | 水区更难走、门只有某些敌人能走 |
比如水面区域 Cost 设置高一点,NPC 就会优先绕路。 如果绕路太远,它才可能穿过水区。
5. AI 基础:NPC 的大脑
游戏 AI 不是一上来就机器学习。新手阶段,最常用的是规则和状态机。
一个敌人可以这样拆:
感知:看到玩家了吗?
决策:追击还是巡逻?
目标:玩家位置还是巡逻点?
移动:交给 NavMeshAgent
行动:播放动画、攻击、音效、特效最简单状态机:
Idle 待机
↓
Patrol 巡逻
↓ 看到玩家
Chase 追击
↓ 距离够近
Attack 攻击
↓ 玩家跑远
Chase 追击
↓ 玩家丢失
Patrol 巡逻6. 学习顺序
建议你这样学:
- 创建一个地面
- 安装 / 使用 AI Navigation
- 添加
NavMesh Surface - 点击
Bake - 创建一个敌人
- 给敌人加
NavMeshAgent - 写脚本让它走到固定点
- 再写脚本让它追玩家
- 加状态机:巡逻、追击、攻击
- 最后加动画、音效、攻击判定
常见问题
| 问题 | 常见原因 |
|---|---|
| NPC 不动 | 没有 Bake NavMesh |
| 报 Agent 不在 NavMesh 上 | 角色起点不在蓝色区域附近 |
| 找不到路 | 目标点不在 NavMesh 上 |
| 卡在墙边 | Agent 半径太大、路太窄 |
| 一直贴脸 | Stopping Distance 太小 |
| 巡逻点走不到 | 巡逻点放在不可走区域 |
| 避障差 | Obstacle 设置不对,或场景太拥挤 |