当前位置: 首页 > article >正文

从零构建Unity NavMesh:烘焙、代理与动态寻路实战

1. 从零开始理解Unity NavMesh如果你玩过RPG或者策略游戏一定对NPC自动寻路的功能不陌生。想象一下当你在游戏中点击某个位置角色会自动绕过障碍物走到目的地——这就是导航寻路系统的魔力。Unity内置的NavMesh系统正是实现这种功能的利器。我第一次接触NavMesh是在开发一个塔防游戏时。当时手动编写寻路算法搞得焦头烂额直到发现了这个神器。它就像给游戏世界铺了一层隐形的地毯AI角色只能在这块地毯上行走。这块地毯是通过烘焙Bake生成的导航网格本质上是一张记录了可行走区域的地图。与A*等传统寻路算法不同NavMesh最大的优势是性能。所有复杂的路径计算都在编辑阶段完成运行时只需要简单的查询。实测下来在移动设备上同时运行20个寻路Agent也能保持60帧。下面我们就从创建一个简单场景开始一步步揭开它的神秘面纱。2. 场景搭建与导航网格烘焙2.1 搭建基础场景打开Unity新建一个3D项目我们先做个简易的迷宫创建平面Plane作为地面添加几个立方体Cube作为障碍物调整立方体位置形成通道这里有个新手常踩的坑尺寸问题。默认的1x1x1立方体在导航中显得太小建议将地面缩放为10倍立方体缩放为2x2x2。可以按这个比例布置你的迷宫// 建议场景尺寸参考 Ground: Position(0,0,0), Scale(10,1,10) Obstacles: Scale(2,2,2)2.2 标记静态障碍物选中所有障碍物和地面在Inspector右上角找到Static下拉菜单。这里要特别注意必须同时勾选Navigation Static和普通Static。我遇到过只勾Navigation Static导致烘焙失败的情况。提示可以全选所有物体后按CtrlShiftN快速添加Navigation Static标记2.3 导航网格烘焙参数详解打开Window AI Navigation面板重点看Bake页签的这些参数Agent Radius相当于角色的体型决定能通过多窄的通道Agent Height影响角色能通过的低矮空间Max Slope可攀爬的最大坡度默认45度Step Height可跨越的台阶高度第一次使用时建议先保持默认值点击Bake按钮。你会看到场景中出现蓝色半透明网格——这就是烘焙好的导航区域。如果发现某些应该通行的区域没有网格可以适当减小Agent Radius。3. 创建导航代理角色3.1 添加NavMeshAgent组件新建一个圆柱体Cylinder作为我们的AI角色。选中它后点击Add Component搜索NavMeshAgent。关键参数解析Speed: 5 // 移动速度米/秒 Angular Speed: 120 // 转向速度度/秒 Acceleration: 8 // 加速度 Stopping Distance: 0.5 // 在距离目标多远时停止3.2 代理与障碍物的交互在场景中尝试移动你的角色会发现它能自动避开障碍物。这得益于NavMeshAgent的自动避障功能。你可以通过修改Avoidance Priority0-99来控制避让优先级数值越高的代理越容易被其他代理避让。实测发现一个小技巧当多个代理相互阻挡时适当降低Speed和Acceleration可以显著减少卡顿现象。比如设置Speed3Acceleration5会让移动看起来更自然。4. 实现动态目标寻路4.1 基础寻路脚本创建一个新C#脚本NavAgentControllerusing UnityEngine; using UnityEngine.AI; public class NavAgentController : MonoBehaviour { [SerializeField] NavMeshAgent agent; [SerializeField] Transform target; void Update() { if(target ! null) agent.SetDestination(target.position); } }把脚本挂到代理角色上然后将NavMeshAgent组件和目标Transform拖拽到对应字段。运行游戏移动目标物体角色就会自动追踪了。4.2 高级寻路技巧路径状态检测是实际项目中的必备技能。修改脚本增加以下功能void Update() { if(agent.pathPending) return; // 路径计算中 if(agent.remainingDistance agent.stoppingDistance) { if(!agent.hasPath || agent.velocity.sqrMagnitude 0f) { // 到达目的地后的逻辑 Debug.Log(到达目标); } } }这段代码解决了两个常见问题避免每帧重复计算路径精确判断到达状态考虑停止距离和惯性5. 动态障碍物处理5.1 添加NavMeshObstacle对于会移动的障碍物比如推箱子的箱子需要添加NavMeshObstacle组件。关键设置Shape选择Box或Carve根据物体形状Carve勾选后会在移动时实时更新导航网格Move Threshold位移超过此值才重新计算5.2 性能优化建议动态障碍物虽然方便但过度使用会导致性能下降。我的经验法则是静态物体永远用Navigation Static偶尔移动的物体用NavMeshObstacleCarve频繁移动的物体改用物理碰撞Agent避让曾经在一个项目中我把50个动态障碍物都开了Carve结果帧率直接掉到20。后来改用分层处理性能立刻回到60帧。6. 常见问题排查6.1 烘焙问题问题烘焙后没有蓝色网格显示解决确认所有障碍物都标记了Navigation Static检查Navigation窗口的Display页签是否勾选Show NavMesh尝试增大Bake面板的Agent Radius6.2 寻路问题问题Agent卡在角落不动解决减小Agent的Radius和Height检查目标点是否在导航网格上用Debug.DrawLine可视化路径增加NavMeshAgent的Obstacle Avoidance Quality6.3 动态障碍物问题问题角色穿过应该避开的障碍物解决确认NavMeshObstacle的Carve已启用检查障碍物Layer是否被Agent的Avoidance Mask包含适当减小Obstacle的Carve Only Stationary阈值7. 实战案例巡逻AI实现结合上面知识我们实现一个简单的巡逻系统public class PatrolAI : MonoBehaviour { public Transform[] waypoints; private int currentWaypoint 0; private NavMeshAgent agent; void Start() { agent GetComponentNavMeshAgent(); GoToNextPoint(); } void GoToNextPoint() { if(waypoints.Length 0) return; agent.SetDestination(waypoints[currentWaypoint].position); currentWaypoint (currentWaypoint 1) % waypoints.Length; } void Update() { if(agent.remainingDistance 0.5f !agent.pathPending) { GoToNextPoint(); } } }这个脚本可以让AI在预设的路径点间循环移动。在实际项目中我通常会加上随机停留时间和路径点随机偏移让移动看起来更自然。

相关文章:

从零构建Unity NavMesh:烘焙、代理与动态寻路实战

1. 从零开始理解Unity NavMesh 如果你玩过RPG或者策略游戏,一定对NPC自动寻路的功能不陌生。想象一下,当你在游戏中点击某个位置,角色会自动绕过障碍物走到目的地——这就是导航寻路系统的魔力。Unity内置的NavMesh系统,正是实现这…...

你的LoRA微调为什么效果差?可能是这5个参数没调对(LLaMA-Factory实战避坑)

你的LoRA微调为什么效果差?可能是这5个参数没调对(LLaMA-Factory实战避坑) 当你在LLaMA-Factory中进行LoRA微调时,是否遇到过模型表现不如预期的情况?许多开发者在使用LoRA这种高效的参数高效微调方法时,常…...

深入VS编译后台:从cl.exe到link.exe,一次C++代码的完整‘旅程’都发生了什么?

深入VS编译后台:从cl.exe到link.exe,一次C代码的完整‘旅程’都发生了什么? 当你在Visual Studio中点击"生成"按钮时,背后其实隐藏着一系列精密的工序。这就像把一块原石雕琢成精美的艺术品,需要经过多道工序…...

OFA在遥感图像分析中的应用:卫星影像智能解读

OFA在遥感图像分析中的应用:卫星影像智能解读 1. 引言 卫星影像分析一直是地理信息科学和遥感技术领域的核心课题。传统方法需要专业分析师花费数小时甚至数天时间手动解读图像,识别地表特征、建筑物分布和植被覆盖等情况。随着高分辨率卫星数据的爆炸…...

AI专著撰写新趋势:AI工具助力,快速完成20万字专著创作!

撰写学术专著是一项复杂的任务,需要在“内容的深度”和“覆盖的广度”之间找到恰当的平衡点。这也是许多研究者在创作过程中常遇到的难题。从内容深度来看,AI写专著时,核心观点必须具备足够的学术价值,既要明确“是什么”&#xf…...

PUBG-Logitech自动压枪系统深度解析与技术优化指南

PUBG-Logitech自动压枪系统深度解析与技术优化指南 【免费下载链接】PUBG-Logitech PUBG罗技鼠标宏自动识别压枪 项目地址: https://gitcode.com/gh_mirrors/pu/PUBG-Logitech PUBG-Logitech是一款基于罗技鼠标宏API与计算机视觉技术的高级游戏辅助工具,通过…...

保姆级教程:手把手搭建你的第一个ARM AHB+APB+CPU小系统(附仿真环境配置)

从零构建ARM AHBAPBCPU系统的实战指南 在数字IC设计领域,能够独立完成一个完整的SOC系统集成是工程师能力的重要分水岭。本文将带你从零开始,构建一个基于AMBA总线架构的简易SOC系统,包含AHB、APB总线和CPU核心的完整集成方案。不同于理论概述…...

5个步骤从零开始:用OBS StreamFX打造电影级直播画面

5个步骤从零开始:用OBS StreamFX打造电影级直播画面 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, or even custom …...

终极免费云顶之弈辅助工具:TFT Overlay完全使用指南

终极免费云顶之弈辅助工具:TFT Overlay完全使用指南 【免费下载链接】TFT-Overlay Overlay for Teamfight Tactics 项目地址: https://gitcode.com/gh_mirrors/tf/TFT-Overlay 你是否在玩云顶之弈时经常忘记装备合成公式?是否因为复杂的羁绊组合而…...

别再手动算排名了!用Python+TOPSIS算法5分钟搞定多指标决策(附完整代码)

用PythonTOPSIS算法5分钟搞定多指标决策分析 每次面对一堆Excel表格,需要从十几个维度评估供应商、产品方案或投资项目时,你是否也经历过这样的痛苦?手动计算权重、标准化数据、反复核对公式...往往花了大半天时间,最后还发现某个…...

告别点阵:用STM32和TFTLCD(ILI9341)打造一个简易的图形界面菜单

从零构建STM32图形界面:基于ILI9341的嵌入式菜单系统实战 在智能家居控制器、工业仪表等嵌入式设备中,图形用户界面(GUI)已成为提升用户体验的关键要素。传统点阵式LCD已无法满足现代交互需求,而TFT液晶屏配合STM32微控制器,能以较…...

一个注解搞定 SpringBoot 数据、枚举、字典翻译!

👉 这是一个或许对你有用的社群🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 《项目实战(视频)》:从书中学,往事上…...

终极PvZ Toolkit完整指南:如何免费快速修改植物大战僵尸游戏体验

终极PvZ Toolkit完整指南:如何免费快速修改植物大战僵尸游戏体验 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PvZ Toolkit是一款功能强大的植物大战僵尸PC版综合修改器,让…...

别再只盯着总体精度了!深入理解Kappa系数:你的遥感分类结果到底‘好’在哪里?

别再只盯着总体精度了!深入理解Kappa系数:你的遥感分类结果到底‘好’在哪里? 当我们完成一次遥感影像分类后,总会迫不及待地查看总体精度(Overall Accuracy)这个指标。85%!看起来不错&#xff…...

sql_exporter配置避坑指南:手把手教你处理多表关联查询和动态标签(以用户订单分析为例)

SQL Exporter高级配置实战:多表关联查询与动态标签优化指南 当业务监控需求从简单的单表统计升级到跨多表的复杂分析时,很多使用sql_exporter的工程师会遇到指标映射混乱、查询性能低下等问题。本文将聚焦三个典型痛点场景:多表JOIN时的指标设…...

STM32 SAI接口实战:用CubeMX快速配置多通道音频采集(附DMA优化技巧)

STM32 SAI接口实战:用CubeMX快速配置多通道音频采集(附DMA优化技巧) 在嵌入式音频处理领域,STM32的SAI(Serial Audio Interface)接口因其灵活性和高性能成为多通道音频采集的理想选择。本文将带您从零开始&…...

从单张RGB-D图像到3D点云:用Open3D五分钟重建你的桌面场景

从单张RGB-D图像到3D点云:用Open3D五分钟重建你的桌面场景 当iPhone的LiDAR扫描仪捕捉到桌面上咖啡杯的轮廓时,那些跳动的深度数据点背后,隐藏着一个完整的3D世界。本文将以一杯咖啡的深度图像为起点,带你体验从二维像素到三维点云…...

别再只接电阻了!ITR9909反射光电管驱动能力不足?试试这颗BC517达林顿管的补救方案

光电传感器驱动困境破解:从ITR9909到BC517的实战升级方案 在电子DIY和自动化控制领域,反射式光电传感器因其非接触检测特性被广泛应用。但许多初学者在初次使用ITR9909这类反射光电管时,常会遇到一个令人困惑的问题——明明按照典型电路连接了…...

用E4A中文安卓编程,手把手教你做一个能远程控制STM32的APP(基于OneNET MQTT)

用E4A中文安卓编程打造STM32远程控制APP:从零到上线的完整指南 在物联网项目开发中,硬件与移动端的无缝对接往往是开发者面临的一大挑战。传统Android开发需要掌握Java或Kotlin,这对嵌入式开发者来说门槛较高。E4A(易安卓&#xf…...

基于STM32与ST7796S的4寸LCD-TFT屏SPI驱动优化实践

1. STM32与ST7796S的硬件基础解析 第一次接触STM32驱动TFT屏时,我对着密密麻麻的引脚定义图发呆了半小时。直到把ST7796S的数据手册翻到第37页,才真正理解这个4寸屏的运作机制。ST7796S这颗驱动芯片支持的最大分辨率是320x480,内置的345600字…...

iOS App审核被拒?手把手教你搞定MFI配件PPID配置(以Honeywell Captuvo为例)

iOS App审核被拒?手把手教你搞定MFI配件PPID配置(以Honeywell Captuvo为例) 当你兴冲冲地将集成了Honeywell Captuvo SDK的iOS应用提交到App Store审核,却收到苹果冰冷的拒绝邮件时,那种挫败感我深有体会。作为经历过三…...

告别手动配置!利用ESPHome+巴法云MQTT桥接,优雅管理你的ESP8266设备到HA

ESPHome巴法云MQTT桥接:打造智能家居设备的工业化管理方案 当你的智能家居设备数量突破两位数时,那种为每个ESP8266单独编写Arduino代码、逐个修改YAML配置的日子就该结束了。这不是关于如何点亮第一个LED灯的教程,而是为已经跨过入门阶段&am…...

别再只盯着LoRaWAN了!智能水表数据采集的三种传感器(干簧管/霍尔/光电)实战选型与电路设计避坑

智能水表传感器选型实战:干簧管、霍尔与光电技术的深度对比 在物联网智能水表的设计中,传感器选型直接决定了产品的核心性能与市场竞争力。面对市面上主流的干簧管、霍尔元件和光电转换三种技术方案,硬件团队需要从实际应用场景出发&#xff…...

避坑指南:开启Linux Framebuffer Console后系统卡住?排查LCD驱动里的这两个关键点

Linux Framebuffer Console卡死?深入解析LCD驱动中的两个致命陷阱 当你在嵌入式项目中为LCD屏配置Framebuffer Console时,是否遇到过内核启动卡在"starting kernel..."后毫无反应的窘境?这种看似简单的显示功能背后,隐藏…...

手把手教你用ESP32和LT8705复刻电赛C题三端口DC-DC变换器(附完整代码与PCB)

从零构建三端口DC-DC变换器:ESP32与LT8705实战指南 在电子设计竞赛和实际电源系统开发中,多端口DC-DC变换器的设计与实现一直是技术难点与热点。本文将带你完整实现一个基于ESP32和LT8705的三端口变换系统,涵盖硬件选型、电路设计、PCB制作到…...

YOLOv8项目实战:用FasterNet替换Backbone,在树莓派上实现实时检测的完整流程(附性能对比)

YOLOv8轻量化实战:FasterNet主干网络在树莓派上的部署与性能优化 边缘计算设备如树莓派因其低功耗和便携性,成为物联网和嵌入式视觉应用的理想选择。然而,这类设备的计算资源有限,传统目标检测模型往往难以实现实时性能。本文将详…...

51单片机新手必看:用Proteus仿真LM016L液晶屏,从接线到显示完整流程

51单片机与Proteus仿真:LM016L液晶屏从零到显示的实战指南 第一次接触51单片机和Proteus仿真时,面对LM016L液晶屏的接线与显示控制,很多新手都会感到无从下手。屏幕不亮、显示乱码、无法初始化——这些问题看似简单,却往往让初学者…...

Kafka命令行实战:从查看主题到生产消费数据的保姆级操作手册(附常见错误排查)

Kafka命令行实战:从查看主题到生产消费数据的保姆级操作手册(附常见错误排查) 刚接触Kafka时,面对复杂的分布式架构和晦涩的术语,很多开发者会感到无从下手。命令行工具作为最直接的交互方式,是理解Kafka内…...

如何高效实现网站内容本地化备份:WebSite-Downloader实战指南

如何高效实现网站内容本地化备份:WebSite-Downloader实战指南 【免费下载链接】WebSite-Downloader 项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader 在信息时代,重要网页随时可能消失或改版,你是否曾遇到过急需访…...

OSPF网络优化核心:深入解析DR与BDR的选举机制与实战价值

1. 为什么你的OSPF网络越跑越慢? 每次看到企业园区网的OSPF性能问题,我都会想起刚入行时踩过的坑。当时接手一个200路由器的网络,运行一段时间后CPU使用率直接飙到90%,全网延迟高得离谱。排查后发现,核心问题就出在OSP…...