Unity 之Navigation烘焙

Building a NavMesh

在Unity中,NavMesh  的生成操作需要Navigation窗口(在Window> Navigation

在你的场景中构建NavMesh只需要4个步骤:

  1. 选择场景中需要生成寻路的几何体-可行走表面和障碍物。
  2. 在NavMesh面板中选择需要烘焙寻路的物体,检测是否勾选Navigation Static.
  3. 根据你的agent大小来调整bake 面板的设置。
    • Agent Radius : agent可以距离墙体 ,窗户或边缘多近的距离。
    • Agent Height : agent可以通过的最低的空间高度。
    • Max Slope : agent可以直接行走上去的最小坡度。
    • Step Height:  agent可以踩上(走上)的障碍物最高高度。
  4. 点击bake按钮烘焙NavMesh。

当你的Navigation窗口打开并且可见时,烘焙的NavMesh结果在场景中会以蓝色的覆盖层在物体的几何体表面显示。

When baking is complete, you will find a NavMesh asset file inside a folder with the same name as the scene the NavMesh belongs to. For example, if you have a scene called First Level in the Assets folder, the NavMesh will be at Assets > First Level > NavMesh.asset.当烘焙结束后,你可以找到一个名字和你的场景名一样的文件夹,里面有一个NavMesh的资源文件,是属于这个场景的NavMesh。

让物体可烘焙的其他方法

直接选择物体在Inspector面板顶部的Static 菜单,你可以直接选择Navigation Static,而不用再打开Navigation 窗口。

NavMesh烘焙的高级设置

最小区域面积

Min Region Area 允许你剔除掉小的非连接NavMesh区域,当NavMesh区域小于指定值时将被剔除。

请注意:有些区域可能无法被移除,尽管有Min Region Area 的设置,原因是NavMesh的构建是一个个的网格并行构建。当一个区域横跨两个网格将不会被移除,因为区域修剪过程中无法获取到周围的网格。

Voxel Size 立体像素尺寸

Manual voxel size :允许你改变烘焙操作过程中的精确性。

Navigation在构建寻路网格过程中,第一遍会把场景光栅化为体素,然后提取可行走区域,最后可行走区域会烘焙成网格。因此体素尺寸Voxel Size的决定了寻路网格烘焙的精准性。

提示:默认的体素设置最好的权衡了准确性和烘焙速度。在烘焙场景寻路的过程中,体素的增加会造成4x倍的内存消耗和4x倍的时间消耗。因此通常,你不需要自己去设置Voxel Size。


Smaller Agent Radius

系统烘焙寻路是也会减小voxel size。如果你的agent尺寸保持不变,可能不需要增加NavMesh的构建分辨率。

更简单的方法如下所示:

  1. 设置你的半径为真实agent半径
  2. 打开Manual Voxel Size,这会保持当前的voxel的大小并且冻结它。
  3. 人为的将你的Agent Radius设置小,因为你已经勾选了Manual Voxel Size ,voxel size将不会改变。

Height mesh : 允许你为角色提供更精准的位置。

While navigating, the NavMesh Agent is constrained on the surface of the NavMesh. Since the NavMesh is an approximation of the walkable space, some features are evened out when the NavMesh is being built. For example, stairs may appear as a slope in the NavMesh. If your game requires accurate placement of the agent, you should enable Height Mesh building when you bake the NavMesh. The setting can be found under the Advanced settings in Navigation window. Note that building Height Mesh will take up memory and processing at runtime, and it will take a little longer to bake the NavMesh.

尽管普通的NavMesh 已经可以很好的运行,但是由于NavMesh只是一个近似的可行走的空间,只保持了一些均衡的特性,如果你的游戏agent需要更精准的行走位置,你可以启用高度网格Height Mesh,

注意:高度网格Height Mesh将占用你“运行时”的内存和cpu,并且需要更多的烘焙时间。


<think>好的,我现在需要帮助用户解决关于在Unity中通过烘焙实现寻路功能的问题。首先,我需要仔细理解用户的需求。用户提到了“烘焙”和“寻路”,结合提供的引用内容,看起来他们想了解如何利用UnityNavigation系统进行动态烘焙和导航设置。 接下来,我应该回顾用户提供的引用内容,特别是引用[1]、[4]、[5]中的信息,因为这些直接提到了动态烘焙寻路组件的使用。用户可能希望得到一个步骤式的教程,涵盖场景准备、静态设置、参数配置、动态烘焙脚本以及最终效果测试。需要确保回答符合用户的要求,即结构清晰、真实可靠,并且正确使用LaTeX格式。 首先,步骤一应该是场景准备,设置地面和障碍物,并将它们标记为静态,这样才能进行烘焙。引用[5]中提到将Plane和Wall设置为静态,这很关键,因为Navigation系统依赖静态物体来生成可行走区域。 然后,步骤二涉及Navigation窗口的参数配置,如Agent的半径、高度、坡度等。引用[4]详细说明了这些参数的作用,比如Agent Radius和Max Slope,这些参数影响AI代理的移动能力,需要正确设置以确保导航网格正确生成。 接下来是步骤三,烘焙导航网格。这里需要指导用户如何使用Bake按钮生成导航网格,并解释生成的蓝色区域代表可行走区域。引用[5]中的步骤3提到了这一点,用户需要明确如何操作。 步骤四可能涉及动态烘焙的实现,即如何在运行时动态生成和更新导航网格。引用[1]提到了动态烘焙的脚本,需要挂载到人物和地板上,通过范围检测来动态更新烘焙区域。这部分需要详细说明脚本的作用和如何设置触发范围,确保人物移动时周围的区域被正确烘焙。 然后是步骤五,应用NavMeshAgent组件,让角色能够自动寻路。需要引用[2]中的信息,说明如何添加组件并设置目标点,使用SetDestination方法实现移动。此外,可能需要提到OffMeshLink来处理跨越障碍的情况,如引用[3]中提到的添加隐藏平面连接不连续区域。 最后,步骤六是测试和优化,强调调整参数和动态烘焙范围的重要性,引用[1]中的示例说明如何根据需求调整范围大小。 在回答过程中,需要确保所有数学表达式或代码示例使用正确的格式,比如行内公式用$...$,独立公式用$$...$$。同时,生成的相关问题需要围绕用户可能进一步关心的点,如动态烘焙原理、性能优化、常见问题等,这有助于用户深入学习和解决问题。 需要检查是否有遗漏的步骤或关键点,例如是否提到AreaMask的使用,或者如何处理动态生成的障碍物。引用[4]中的Areas部分可以补充说明如何通过AreaMask屏蔽特定区域,增强寻路的灵活性。 另外,用户提供的引用中有提到动态生成地图和动态烘焙地形,这可能涉及到运行时修改导航网格,需要确保脚本部分正确实现这一功能,如引用[1]中的两个脚本协作。需要详细解释每个脚本的作用,比如一个挂在人物身上用于检测范围,另一个挂在地板上处理烘焙。 最后,确保回答结构清晰,分步骤说明,每个步骤都有对应的引用支持,并且自然地在段落末尾添加引用标识。避免使用复杂的术语,保持语言简洁易懂,适合不同层次的用户理解。</think>以下是在Unity中通过烘焙实现寻路功能的详细教程,结合Navigation系统和动态烘焙技术: ### 一、基础环境搭建 1. **场景准备** - 创建3D Object中的Plane作为地面 - 添加Cube作为障碍物(如墙壁) - 设置障碍物和地面为静态:选中物体后勾选Inspector面板右上角的`Static`[^5] 2. **配置导航参数** 打开`Window > AI > Navigation`窗口: - **Agent参数**: - Agent Radius:$r=0.5m$(角色半径) - Max Slope:$\theta_{max}=45^\circ$(最大可行走坡度) - Step Height:$h_{step}=0.3m$(可跨越高度)[^4] ### 二、静态烘焙流程 ```csharp // 烘焙指令触发代码(编辑器模式) NavMeshBuilder.BuildNavMesh(); ``` 1. 在Navigation窗口选择`Bake`标签 2. 点击`Bake`按钮生成导航网格 3. 生成结果:场景中蓝色区域表示可行走路径[^5] ### 三、动态烘焙实现 需配合两个脚本实现动态范围烘焙: 1. **角色移动检测脚本**(挂载在角色上) ```csharp public class DynamicBaker : MonoBehaviour { public float bakeRadius = 5f; // 烘焙范围半径 void Update() { NavMeshBuilder.UpdateNavMeshData( navMeshData, buildSettings, new Bounds(transform.position, Vector3.one * bakeRadius), // 动态范围 transform.localToWorldMatrix ); } } ``` 该脚本会使角色周围$R=5m$圆形范围实时更新导航网格[^1] 2. **地面响应脚本**(挂载在地板预制体上) ```csharp public class NavMeshUpdater : MonoBehaviour { void OnCollisionEnter(Collision col) { if(col.gameObject.CompareTag("Player")) { BakeLocalArea(col.contacts[0].point); } } } ``` ### 四、导航应用 1. 给角色添加`NavMeshAgent`组件 2. 设置目标点实现自动寻路: ```csharp NavMeshAgent agent = GetComponent<NavMeshAgent>(); agent.SetDestination(targetPosition); // 目标坐标设置[^2] ``` ### 五、特殊地形处理 对于不连续地形(如沟壑): 1. 在缺口处添加隐藏平面 2. 设置该平面为`Navigation Static` 3. 烘焙后隐藏物体[^3] $$ \text{可行走区域} = \bigcup_{i=1}^{n} S_i - \sum_{j=1}^{m} O_j $$ 其中$S_i$为可行走表面,$O_j$为障碍物体积 ### 六、效果验证 完成后的特征: - 角色移动时地面实时生成导航网格 - 自动绕过障碍物选择最短路径 - 可跨越高度$h \leq 0.3m$的台阶[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值