1. 项目概述从蓝图到可玩空间如果你刚接触Unreal Engine可能会觉得“关卡设计”这个词有点大听起来像是游戏策划或者美术总监才需要考虑的宏观布局。但事实上在虚幻引擎的语境里关卡设计是每个开发者无论是程序、美术还是策划都必须上手实操的核心环节。它远不止是摆放几个模型那么简单而是将游戏创意、玩法机制和视觉表现融合成一个可交互、可体验的“世界”的过程。简单来说关卡就是玩家在游戏中实际游玩的场景而关卡设计就是搭建这个场景并定义其中所有规则的艺术与技术的结合。我刚开始用UE做项目时也犯过很多新手常见的错误把一堆精美的资产拖进场景摆得满满当当结果游戏跑起来帧率暴跌玩家进去后晕头转向根本不知道该往哪走。这其实就是只做了“场景布置”而忽略了“设计”与“导航”。一个优秀的关卡必须引导玩家的注意力控制他们的情绪节奏并让他们在探索中感到自然流畅而不是困惑和挫败。这背后离不开一套强大的工具链和设计思维而Unreal Engine提供的关卡编辑器Level Editor和导航系统Navigation System正是实现这一切的基石。本次分享我将结合自己踩过的坑和总结的经验带你深入理解Unreal Engine中关卡设计与导航的核心。我们会从最基础的关卡编辑器操作讲起一步步拆解如何构建一个逻辑清晰、性能优良且导航顺畅的可玩空间。无论你是想制作一个精致的解谜关卡还是一个开放世界的探索区域这些基础原则都是相通的。2. 核心设计思路与工作流拆解在动手搭建任何几何体之前理清设计思路至关重要。盲目地在编辑器里堆砌资产是效率最低、效果最差的做法。一个高效的关卡设计工作流通常遵循“概念-白模-细化-优化”的循环。2.1 从2D草图到3D白模确立空间骨架一切始于纸上或数位板上的草图。不要一上来就打开UE先用简单的线条和方块勾勒出关卡的平面布局图。这个阶段的核心是规划玩家动线和关键节点。玩家动线想象玩家会如何穿过这个空间。是线性推进还是环形探索动线决定了关卡的基本结构。用箭头在草图上标出预期的行进路线。关键节点这是动线上的“锚点”比如一个需要解谜的房间、一个Boss战区域、一个重要的资源点。在草图上圈出这些区域并思考它们之间的连接关系。草图完成后进入UE创建白模Greyboxing。这是整个流程中最关键的一步也是新手最容易跳过的一步。白模就是用最基础的几何体如BSP笔刷或简单的静态网格体快速搭建出关卡的体积、比例和主要通路。永远不要在白模阶段使用最终的高精度资产。你的目标是用简单的方块和圆柱体验证以下几点空间尺度感玩家角色在这个空间里移动感觉是大还是小跳跃距离是否合理门廊的高度会不会碰头这些都需要在实际的3D空间中感受。玩法可行性你设计的那个跳跃平台用白模方块搭出来玩家真的能跳过去吗你规划的掩体真的能提供足够的保护吗在白模阶段测试玩法成本极低修改起来也飞快。视觉引导即使是用灰色方块你也可以通过布局、光线用简单的定向光或点光源和空间的开合变化来引导玩家的视线。玩家进入一个区域后第一眼会看向哪里下一个目标是否清晰实操心得我习惯为白模阶段创建一个独立的“开发”图层Layer并将所有白模几何体放在里面。这样在后续替换为精美资产时可以轻松地隐藏或删除整个白模层而不会影响其他内容。另外多用UE的测量工具按住Ctrl键移动物体可以吸附到网格确保尺寸精准。2.2 模块化设计与资产整合当白模通过验证后就可以开始用真正的美术资产替换那些灰色方块了。这里强烈推荐模块化设计理念。与其为每一面墙、每一段走廊都制作独一无二的模型不如创建一套可以像乐高一样拼接的标准化模块如不同尺寸的墙板、地板、天花板、门窗、楼梯等。模块化的优势巨大提升效率美术制作一套模块关卡设计师可以组合出无数种变化。保证一致性整个关卡的视觉风格高度统一。优化性能相同的模块可以被引擎实例化渲染大幅降低Draw Call。便于迭代如果需要修改某种墙体的纹理只需要更新一个母资产所有使用它的地方都会自动更新。在UE中这些模块通常以静态网格体Static Mesh的形式存在。你可以将它们从内容浏览器拖入关卡并使用移动、旋转、缩放工具进行摆放。UE的吸附功能端点吸附、表面吸附能帮助你精准地对齐模块。2.3 光照与氛围构建基础资产摆放完毕后关卡还缺乏灵魂。这时就需要光照和后期处理Post Process来注入氛围。UE的光照系统非常强大但对于入门而言需要掌握几个核心光源类型定向光Directional Light模拟太阳或月亮提供全局的主光源和阴影方向。这是场景的“定调”光源。点光源Point Light像灯泡一样从一点向所有方向发光用于室内照明、台灯、火把等。聚光灯Spot Light发出锥形光束用于手电筒、车灯、舞台射灯等。天光Sky Light捕捉场景周围的天空或指定的立方体贴图作为环境光提供柔和的全局照明和反射信息。对于静态关卡布局不会变使用静态光照Static Lighting能获得最好的视觉效果和运行时性能但需要烘焙光照贴图Lightmap这个过程比较耗时。对于动态关卡或需要快速迭代的阶段可以先用固定光照Stationary或动态光照Movable。注意事项光照是性能杀手。避免使用过多重叠的动态光源。善用光照通道Lighting Channels和光照重要性体积Lightmass Importance Volume来控制烘焙的范围和精度只在玩家活动区域进行高质量的光照计算。3. 导航系统核心让AI与玩家“认识路”关卡搭建得再漂亮如果里面的NPC像无头苍蝇一样乱撞或者玩家根本找不到路体验也会瞬间崩塌。这就是UE导航系统Navigation System 常被称为NavMesh发挥作用的地方。3.1 导航网格NavMesh原理浅析你可以把NavMesh想象成铺在关卡可行走区域上的一层“隐形地毯”。这层地毯由无数个相连的凸多边形通常是三角形组成它定义了AI角色或带有自动移动功能的玩家角色可以安全行走的路径区域。AI的路径寻找Pathfinding算法比如常见的A*算法就是在这张网格上计算从起点到终点的最短或最优路径。在UE中生成这片“地毯”的核心组件是导航网格体边界体积Nav Mesh Bounds Volume。你只需要将这个体积框住你希望AI可以行走的整个区域然后在编辑器中选择“构建路径”Build Paths引擎就会自动扫描该体积内的所有几何体考虑它们的碰撞属性并生成导航网格。3.2 导航相关组件详解要让一个角色利用NavMesh进行移动通常需要以下几个组件协同工作导航网格体代理组件NavMeshAgent Component这个组件需要添加到你的AI角色蓝图或Pawn类中。它负责与导航系统通信接收移动指令并沿着计算好的路径移动角色。你可以在这里设置角色的半径、高度、最大移动速度、加速度等参数。寻路移动组件如CharacterMovementComponent对于继承自Character类的角色其自带的移动组件会与NavMeshAgent配合处理实际的物理移动、避障避免与其他动态物体碰撞和动画驱动。AI控制器AIController它承载了角色的“大脑”。通过行为树Behavior Tree和黑板Blackboard系统AI控制器可以下达复杂的移动指令比如“移动到某个位置”、“追击玩家”、“巡逻一系列路径点”。3.3 高级导航控制导航链接与区域基础的NavMesh只能处理平面行走。但游戏世界是立体的有跳跃、有坠落、有梯子。这就需要更高级的工具导航链接代理NavLinkProxy用于定义NavMesh之间的特殊连接。最常见的是导航链接代理NavLinkProxy你可以用它来创建“跳跃点”或“坠落点”。比如在两个有高度差的平台之间放置一个NavLinkProxyAI就知道它可以跳过去而不是傻傻地在边缘徘徊。导航区域NavArea你可以为导航网格的不同部分打上“标签”定义其通行成本、难度或类型。例如创建一个“泥泞”区域设置其通行成本为2.0AI在寻路时会优先选择成本为1.0的普通道路。创建一个“危险”区域如火焰区AI只有在必要时才会穿越。创建一个“不可行走”区域如水域AI会完全避开。在UE编辑器中你可以通过绘制导航修改体积Nav Modifier Volume来方便地覆盖一片区域并将其关联到特定的导航区域类。4. 实战构建一个带导航的简单巡逻关卡理论说再多不如动手做一遍。让我们来创建一个最简单的场景一个封闭房间里面有一个AI守卫在几个固定点之间循环巡逻。4.1 步骤一搭建基础场景与导航网格创建基础几何体新建一个空白关卡。使用基本几何体或导入模块化资产快速搭建一个矩形房间。确保地面是连续的平面。放置导航体积从模式面板Modes Panel的“体积Volumes”分类中拖拽一个导航网格体边界体积Nav Mesh Bounds Volume到场景中。调整体积大小选中该体积使用缩放工具按R键将其调整到完全覆盖房间的内部可行走区域包括所有角落。体积的黄色边框就是NavMesh的生成范围。生成导航网格点击编辑器工具栏上的“构建Build”按钮或按CtrlShift;在下拉菜单中选择“构建路径Build Paths”。构建完成后在视口左上角的下拉菜单中勾选“显示 可视化 导航”你就能看到地面上覆盖了一层绿色的网格即NavMesh。4.2 步骤二创建巡逻AI角色创建AI角色蓝图在内容浏览器中右键选择“蓝图类”。在父类选择中搜索并选择“Character”它已经包含了移动组件和胶囊体碰撞。命名为BP_AIGuard。添加导航代理打开BP_AIGuard蓝图在组件面板中点击“添加组件”搜索并添加“导航网格体代理NavMeshAgent”。配置AI控制器在蓝图细节面板的“Pawn”分类下将“AI控制器类”设置为“AIController”或你自定义的AI控制器。添加一个简单的网格体从组件面板添加一个静态网格体组件StaticMeshComponent并指定一个简单的形状如立方体作为视觉表现。4.3 步骤三设置巡逻逻辑使用行为树这是核心部分我们将使用行为树Behavior Tree来定义“巡逻”这个行为。创建行为树和黑板在内容浏览器右键选择“人工智能 行为树”命名为BT_GuardPatrol。再右键选择“人工智能 黑板”命名为BB_GuardPatrol。定义黑板键Blackboard Keys打开BB_GuardPatrol添加两个键NextPatrolPoint类型为“Vector”用于存储下一个要去的巡逻点位置。CurrentPatrolIndex类型为“Int”用于记录当前巡逻到了第几个点。编辑行为树逻辑打开BT_GuardPatrol。从根节点Root拉出一个序列Sequence节点。在序列节点下首先添加一个设置黑板值Set Blackboard Value的任务节点。将其设置为初始化CurrentPatrolIndex为0。接着拉出一个选择器Selector节点它会从左到右执行子节点直到一个成功。在选择器下第一个子节点放一个移动到Move To任务节点。在细节面板中将“黑板键Blackboard Key”设置为NextPatrolPoint并设置“接受半径Acceptable Radius”为50单位厘米这样AI到达目标点附近就算成功。选择器的第二个子节点放一个等待Wait任务节点设置等待时间如3秒模拟AI在点位上停留观察。选择器的第三个子节点放一个自定义任务或使用“设置黑板值”任务用于计算下一个巡逻点索引CurrentPatrolIndex (CurrentPatrolIndex 1) % 巡逻点总数并根据索引更新NextPatrolPoint的值。这个“计算下一个点”的逻辑通常需要你写一个简单的蓝图函数或任务节点来实现其核心是访问一个存储了所有巡逻点位置的数组。关联到AI回到BP_AIGuard蓝图在事件图表Event Graph或组件细节中找到AI控制器相关设置将“行为树Behavior Tree”资产指定为我们刚创建的BT_GuardPatrol并将“黑板Blackboard”指定为BB_GuardPatrol。放置巡逻点和AI在关卡中放置几个空Actor或简单的Sprite作为巡逻路径点记录下它们的世界坐标。在你上一步实现的“计算下一个点”逻辑中需要能访问到这个路径点数组。最后将BP_AIGuard拖入关卡放置在NavMesh范围内。运行游戏你应该能看到AI角色按照你设定的路径点开始循环巡逻了。5. 性能优化与常见问题排查关卡设计和导航系统用得好是神器用不好就是性能黑洞和Bug温床。下面是一些关键的优化点和排错经验。5.1 导航性能优化要点精确控制NavMesh生成范围Nav Mesh Bounds Volume不要盲目地覆盖整个关卡只框住AI确实需要活动的区域。每增加一平米构建时间和运行时数据都会增加。合理设置代理参数在NavMeshAgent组件中“代理半径Agent Radius”不要设置得过大。这个半径会影响NavMesh的生成引擎会从几何体表面向内“侵蚀”这个半径来生成可行走区域过大的半径会导致狭窄通道无法生成网格。通常设置为略大于角色碰撞胶囊体的半径即可。使用导航网格体代理NavModifier进行精细化控制对于复杂地形比如有大量装饰性小物件石块、灌木的地面如果让引擎自动处理可能会生成非常破碎的NavMesh。更好的做法是用一个大而平整的NavMeshBoundsVolume生成基础网格然后使用NavModifierVolume将那些小物件所在的区域标记为“不可行走”这样能获得更干净、性能更好的导航网格。动态障碍物处理对于会移动、会开门关门等动态阻挡物可以使用导航障碍物Nav Obstacle组件。将其添加到动态物体上它会在运行时动态地“挖掉”NavMesh上对应的区域让AI能够实时避让。5.2 常见问题与解决方案速查表问题现象可能原因排查与解决步骤AI角色站在原地不动不寻路。1. 角色不在NavMesh上。2. 行为树未运行或逻辑错误。3. AI控制器未正确设置。1. 视口中开启导航显示确认角色胶囊体底部在绿色NavMesh范围内。2. 检查角色蓝图中是否设置了正确的AIController Class、Behavior Tree和Blackboard资产。3. 在游戏运行时打开“控制台命令~”输入ai.DebugBehaviorTree查看行为树执行状态。AI寻路时卡在角落或物体边缘。1. 代理半径设置过大。2. NavMesh在该区域生成不准确或有缝隙。3. 移动组件的避障设置问题。1. 调小NavMeshAgent的Agent Radius。2. 检查该处场景几何体的碰撞是否复杂尝试简化碰撞或手动放置NavModifierVolume修正。3. 检查CharacterMovementComponent中的Avoidance相关参数适当调整避障质量和距离。构建导航路径时非常慢。1. 导航边界体积过大或过于复杂。2. 场景中可导航几何体太多。3. 导航体代理数量过多。1. 缩小NavMeshBoundsVolume范围仅包含必要区域。2. 对不会行走上去的复杂静态网格体在其细节面板的“碰撞Collision”中取消勾选“在导航中可生成Can Affect Navigation”。3. 考虑将大的导航区域分割成多个小体积分别构建。AI无法跨越两个平台间的间隙即使看起来能跳过去。两个平台的NavMesh没有连接。在两个平台间的NavMesh边缘处放置一个导航链接代理NavLinkProxy并正确设置其起点和终点。烘焙光照后导航显示异常或AI路径错误。导航系统的显示依赖于某些调试视图而光照烘焙过程可能会重建某些场景数据。在构建路径后如果发现导航显示问题尝试先进行一次“仅构建光照Build Lighting Only”然后再“构建路径”。确保操作顺序。另外导航数据的构建不依赖于光照但场景几何体的更改会影响两者。5.3 一个关于导航动态更新的坑我曾经遇到一个棘手的问题一个可被玩家推动的箱子推走后AI仍然认为原位置是不可通行的导致寻路失败。原因是这个箱子的碰撞是静态的导航系统在构建时将其视为永久障碍。解决方案对于这类动态物体不能只用普通的静态网格体碰撞。你需要为这个箱子添加一个NavModifierComponent组件。将该组件的“区域类Area Class”设置为一个自定义的、通行成本极高的区域或者直接使用“不可行走”区域。关键一步在箱子的蓝图里编写逻辑当箱子被移动时调用该NavModifierComponent的RefreshModifier()函数。这会强制导航系统重新计算该区域更新NavMesh。这个细节在很多教程里不会提但却是实现与动态物体交互的AI导航时必须掌握的技巧。
Unreal Engine关卡设计与导航系统实战:从白模到AI寻路全流程解析
发布时间:2026/7/13 9:59:41
1. 项目概述从蓝图到可玩空间如果你刚接触Unreal Engine可能会觉得“关卡设计”这个词有点大听起来像是游戏策划或者美术总监才需要考虑的宏观布局。但事实上在虚幻引擎的语境里关卡设计是每个开发者无论是程序、美术还是策划都必须上手实操的核心环节。它远不止是摆放几个模型那么简单而是将游戏创意、玩法机制和视觉表现融合成一个可交互、可体验的“世界”的过程。简单来说关卡就是玩家在游戏中实际游玩的场景而关卡设计就是搭建这个场景并定义其中所有规则的艺术与技术的结合。我刚开始用UE做项目时也犯过很多新手常见的错误把一堆精美的资产拖进场景摆得满满当当结果游戏跑起来帧率暴跌玩家进去后晕头转向根本不知道该往哪走。这其实就是只做了“场景布置”而忽略了“设计”与“导航”。一个优秀的关卡必须引导玩家的注意力控制他们的情绪节奏并让他们在探索中感到自然流畅而不是困惑和挫败。这背后离不开一套强大的工具链和设计思维而Unreal Engine提供的关卡编辑器Level Editor和导航系统Navigation System正是实现这一切的基石。本次分享我将结合自己踩过的坑和总结的经验带你深入理解Unreal Engine中关卡设计与导航的核心。我们会从最基础的关卡编辑器操作讲起一步步拆解如何构建一个逻辑清晰、性能优良且导航顺畅的可玩空间。无论你是想制作一个精致的解谜关卡还是一个开放世界的探索区域这些基础原则都是相通的。2. 核心设计思路与工作流拆解在动手搭建任何几何体之前理清设计思路至关重要。盲目地在编辑器里堆砌资产是效率最低、效果最差的做法。一个高效的关卡设计工作流通常遵循“概念-白模-细化-优化”的循环。2.1 从2D草图到3D白模确立空间骨架一切始于纸上或数位板上的草图。不要一上来就打开UE先用简单的线条和方块勾勒出关卡的平面布局图。这个阶段的核心是规划玩家动线和关键节点。玩家动线想象玩家会如何穿过这个空间。是线性推进还是环形探索动线决定了关卡的基本结构。用箭头在草图上标出预期的行进路线。关键节点这是动线上的“锚点”比如一个需要解谜的房间、一个Boss战区域、一个重要的资源点。在草图上圈出这些区域并思考它们之间的连接关系。草图完成后进入UE创建白模Greyboxing。这是整个流程中最关键的一步也是新手最容易跳过的一步。白模就是用最基础的几何体如BSP笔刷或简单的静态网格体快速搭建出关卡的体积、比例和主要通路。永远不要在白模阶段使用最终的高精度资产。你的目标是用简单的方块和圆柱体验证以下几点空间尺度感玩家角色在这个空间里移动感觉是大还是小跳跃距离是否合理门廊的高度会不会碰头这些都需要在实际的3D空间中感受。玩法可行性你设计的那个跳跃平台用白模方块搭出来玩家真的能跳过去吗你规划的掩体真的能提供足够的保护吗在白模阶段测试玩法成本极低修改起来也飞快。视觉引导即使是用灰色方块你也可以通过布局、光线用简单的定向光或点光源和空间的开合变化来引导玩家的视线。玩家进入一个区域后第一眼会看向哪里下一个目标是否清晰实操心得我习惯为白模阶段创建一个独立的“开发”图层Layer并将所有白模几何体放在里面。这样在后续替换为精美资产时可以轻松地隐藏或删除整个白模层而不会影响其他内容。另外多用UE的测量工具按住Ctrl键移动物体可以吸附到网格确保尺寸精准。2.2 模块化设计与资产整合当白模通过验证后就可以开始用真正的美术资产替换那些灰色方块了。这里强烈推荐模块化设计理念。与其为每一面墙、每一段走廊都制作独一无二的模型不如创建一套可以像乐高一样拼接的标准化模块如不同尺寸的墙板、地板、天花板、门窗、楼梯等。模块化的优势巨大提升效率美术制作一套模块关卡设计师可以组合出无数种变化。保证一致性整个关卡的视觉风格高度统一。优化性能相同的模块可以被引擎实例化渲染大幅降低Draw Call。便于迭代如果需要修改某种墙体的纹理只需要更新一个母资产所有使用它的地方都会自动更新。在UE中这些模块通常以静态网格体Static Mesh的形式存在。你可以将它们从内容浏览器拖入关卡并使用移动、旋转、缩放工具进行摆放。UE的吸附功能端点吸附、表面吸附能帮助你精准地对齐模块。2.3 光照与氛围构建基础资产摆放完毕后关卡还缺乏灵魂。这时就需要光照和后期处理Post Process来注入氛围。UE的光照系统非常强大但对于入门而言需要掌握几个核心光源类型定向光Directional Light模拟太阳或月亮提供全局的主光源和阴影方向。这是场景的“定调”光源。点光源Point Light像灯泡一样从一点向所有方向发光用于室内照明、台灯、火把等。聚光灯Spot Light发出锥形光束用于手电筒、车灯、舞台射灯等。天光Sky Light捕捉场景周围的天空或指定的立方体贴图作为环境光提供柔和的全局照明和反射信息。对于静态关卡布局不会变使用静态光照Static Lighting能获得最好的视觉效果和运行时性能但需要烘焙光照贴图Lightmap这个过程比较耗时。对于动态关卡或需要快速迭代的阶段可以先用固定光照Stationary或动态光照Movable。注意事项光照是性能杀手。避免使用过多重叠的动态光源。善用光照通道Lighting Channels和光照重要性体积Lightmass Importance Volume来控制烘焙的范围和精度只在玩家活动区域进行高质量的光照计算。3. 导航系统核心让AI与玩家“认识路”关卡搭建得再漂亮如果里面的NPC像无头苍蝇一样乱撞或者玩家根本找不到路体验也会瞬间崩塌。这就是UE导航系统Navigation System 常被称为NavMesh发挥作用的地方。3.1 导航网格NavMesh原理浅析你可以把NavMesh想象成铺在关卡可行走区域上的一层“隐形地毯”。这层地毯由无数个相连的凸多边形通常是三角形组成它定义了AI角色或带有自动移动功能的玩家角色可以安全行走的路径区域。AI的路径寻找Pathfinding算法比如常见的A*算法就是在这张网格上计算从起点到终点的最短或最优路径。在UE中生成这片“地毯”的核心组件是导航网格体边界体积Nav Mesh Bounds Volume。你只需要将这个体积框住你希望AI可以行走的整个区域然后在编辑器中选择“构建路径”Build Paths引擎就会自动扫描该体积内的所有几何体考虑它们的碰撞属性并生成导航网格。3.2 导航相关组件详解要让一个角色利用NavMesh进行移动通常需要以下几个组件协同工作导航网格体代理组件NavMeshAgent Component这个组件需要添加到你的AI角色蓝图或Pawn类中。它负责与导航系统通信接收移动指令并沿着计算好的路径移动角色。你可以在这里设置角色的半径、高度、最大移动速度、加速度等参数。寻路移动组件如CharacterMovementComponent对于继承自Character类的角色其自带的移动组件会与NavMeshAgent配合处理实际的物理移动、避障避免与其他动态物体碰撞和动画驱动。AI控制器AIController它承载了角色的“大脑”。通过行为树Behavior Tree和黑板Blackboard系统AI控制器可以下达复杂的移动指令比如“移动到某个位置”、“追击玩家”、“巡逻一系列路径点”。3.3 高级导航控制导航链接与区域基础的NavMesh只能处理平面行走。但游戏世界是立体的有跳跃、有坠落、有梯子。这就需要更高级的工具导航链接代理NavLinkProxy用于定义NavMesh之间的特殊连接。最常见的是导航链接代理NavLinkProxy你可以用它来创建“跳跃点”或“坠落点”。比如在两个有高度差的平台之间放置一个NavLinkProxyAI就知道它可以跳过去而不是傻傻地在边缘徘徊。导航区域NavArea你可以为导航网格的不同部分打上“标签”定义其通行成本、难度或类型。例如创建一个“泥泞”区域设置其通行成本为2.0AI在寻路时会优先选择成本为1.0的普通道路。创建一个“危险”区域如火焰区AI只有在必要时才会穿越。创建一个“不可行走”区域如水域AI会完全避开。在UE编辑器中你可以通过绘制导航修改体积Nav Modifier Volume来方便地覆盖一片区域并将其关联到特定的导航区域类。4. 实战构建一个带导航的简单巡逻关卡理论说再多不如动手做一遍。让我们来创建一个最简单的场景一个封闭房间里面有一个AI守卫在几个固定点之间循环巡逻。4.1 步骤一搭建基础场景与导航网格创建基础几何体新建一个空白关卡。使用基本几何体或导入模块化资产快速搭建一个矩形房间。确保地面是连续的平面。放置导航体积从模式面板Modes Panel的“体积Volumes”分类中拖拽一个导航网格体边界体积Nav Mesh Bounds Volume到场景中。调整体积大小选中该体积使用缩放工具按R键将其调整到完全覆盖房间的内部可行走区域包括所有角落。体积的黄色边框就是NavMesh的生成范围。生成导航网格点击编辑器工具栏上的“构建Build”按钮或按CtrlShift;在下拉菜单中选择“构建路径Build Paths”。构建完成后在视口左上角的下拉菜单中勾选“显示 可视化 导航”你就能看到地面上覆盖了一层绿色的网格即NavMesh。4.2 步骤二创建巡逻AI角色创建AI角色蓝图在内容浏览器中右键选择“蓝图类”。在父类选择中搜索并选择“Character”它已经包含了移动组件和胶囊体碰撞。命名为BP_AIGuard。添加导航代理打开BP_AIGuard蓝图在组件面板中点击“添加组件”搜索并添加“导航网格体代理NavMeshAgent”。配置AI控制器在蓝图细节面板的“Pawn”分类下将“AI控制器类”设置为“AIController”或你自定义的AI控制器。添加一个简单的网格体从组件面板添加一个静态网格体组件StaticMeshComponent并指定一个简单的形状如立方体作为视觉表现。4.3 步骤三设置巡逻逻辑使用行为树这是核心部分我们将使用行为树Behavior Tree来定义“巡逻”这个行为。创建行为树和黑板在内容浏览器右键选择“人工智能 行为树”命名为BT_GuardPatrol。再右键选择“人工智能 黑板”命名为BB_GuardPatrol。定义黑板键Blackboard Keys打开BB_GuardPatrol添加两个键NextPatrolPoint类型为“Vector”用于存储下一个要去的巡逻点位置。CurrentPatrolIndex类型为“Int”用于记录当前巡逻到了第几个点。编辑行为树逻辑打开BT_GuardPatrol。从根节点Root拉出一个序列Sequence节点。在序列节点下首先添加一个设置黑板值Set Blackboard Value的任务节点。将其设置为初始化CurrentPatrolIndex为0。接着拉出一个选择器Selector节点它会从左到右执行子节点直到一个成功。在选择器下第一个子节点放一个移动到Move To任务节点。在细节面板中将“黑板键Blackboard Key”设置为NextPatrolPoint并设置“接受半径Acceptable Radius”为50单位厘米这样AI到达目标点附近就算成功。选择器的第二个子节点放一个等待Wait任务节点设置等待时间如3秒模拟AI在点位上停留观察。选择器的第三个子节点放一个自定义任务或使用“设置黑板值”任务用于计算下一个巡逻点索引CurrentPatrolIndex (CurrentPatrolIndex 1) % 巡逻点总数并根据索引更新NextPatrolPoint的值。这个“计算下一个点”的逻辑通常需要你写一个简单的蓝图函数或任务节点来实现其核心是访问一个存储了所有巡逻点位置的数组。关联到AI回到BP_AIGuard蓝图在事件图表Event Graph或组件细节中找到AI控制器相关设置将“行为树Behavior Tree”资产指定为我们刚创建的BT_GuardPatrol并将“黑板Blackboard”指定为BB_GuardPatrol。放置巡逻点和AI在关卡中放置几个空Actor或简单的Sprite作为巡逻路径点记录下它们的世界坐标。在你上一步实现的“计算下一个点”逻辑中需要能访问到这个路径点数组。最后将BP_AIGuard拖入关卡放置在NavMesh范围内。运行游戏你应该能看到AI角色按照你设定的路径点开始循环巡逻了。5. 性能优化与常见问题排查关卡设计和导航系统用得好是神器用不好就是性能黑洞和Bug温床。下面是一些关键的优化点和排错经验。5.1 导航性能优化要点精确控制NavMesh生成范围Nav Mesh Bounds Volume不要盲目地覆盖整个关卡只框住AI确实需要活动的区域。每增加一平米构建时间和运行时数据都会增加。合理设置代理参数在NavMeshAgent组件中“代理半径Agent Radius”不要设置得过大。这个半径会影响NavMesh的生成引擎会从几何体表面向内“侵蚀”这个半径来生成可行走区域过大的半径会导致狭窄通道无法生成网格。通常设置为略大于角色碰撞胶囊体的半径即可。使用导航网格体代理NavModifier进行精细化控制对于复杂地形比如有大量装饰性小物件石块、灌木的地面如果让引擎自动处理可能会生成非常破碎的NavMesh。更好的做法是用一个大而平整的NavMeshBoundsVolume生成基础网格然后使用NavModifierVolume将那些小物件所在的区域标记为“不可行走”这样能获得更干净、性能更好的导航网格。动态障碍物处理对于会移动、会开门关门等动态阻挡物可以使用导航障碍物Nav Obstacle组件。将其添加到动态物体上它会在运行时动态地“挖掉”NavMesh上对应的区域让AI能够实时避让。5.2 常见问题与解决方案速查表问题现象可能原因排查与解决步骤AI角色站在原地不动不寻路。1. 角色不在NavMesh上。2. 行为树未运行或逻辑错误。3. AI控制器未正确设置。1. 视口中开启导航显示确认角色胶囊体底部在绿色NavMesh范围内。2. 检查角色蓝图中是否设置了正确的AIController Class、Behavior Tree和Blackboard资产。3. 在游戏运行时打开“控制台命令~”输入ai.DebugBehaviorTree查看行为树执行状态。AI寻路时卡在角落或物体边缘。1. 代理半径设置过大。2. NavMesh在该区域生成不准确或有缝隙。3. 移动组件的避障设置问题。1. 调小NavMeshAgent的Agent Radius。2. 检查该处场景几何体的碰撞是否复杂尝试简化碰撞或手动放置NavModifierVolume修正。3. 检查CharacterMovementComponent中的Avoidance相关参数适当调整避障质量和距离。构建导航路径时非常慢。1. 导航边界体积过大或过于复杂。2. 场景中可导航几何体太多。3. 导航体代理数量过多。1. 缩小NavMeshBoundsVolume范围仅包含必要区域。2. 对不会行走上去的复杂静态网格体在其细节面板的“碰撞Collision”中取消勾选“在导航中可生成Can Affect Navigation”。3. 考虑将大的导航区域分割成多个小体积分别构建。AI无法跨越两个平台间的间隙即使看起来能跳过去。两个平台的NavMesh没有连接。在两个平台间的NavMesh边缘处放置一个导航链接代理NavLinkProxy并正确设置其起点和终点。烘焙光照后导航显示异常或AI路径错误。导航系统的显示依赖于某些调试视图而光照烘焙过程可能会重建某些场景数据。在构建路径后如果发现导航显示问题尝试先进行一次“仅构建光照Build Lighting Only”然后再“构建路径”。确保操作顺序。另外导航数据的构建不依赖于光照但场景几何体的更改会影响两者。5.3 一个关于导航动态更新的坑我曾经遇到一个棘手的问题一个可被玩家推动的箱子推走后AI仍然认为原位置是不可通行的导致寻路失败。原因是这个箱子的碰撞是静态的导航系统在构建时将其视为永久障碍。解决方案对于这类动态物体不能只用普通的静态网格体碰撞。你需要为这个箱子添加一个NavModifierComponent组件。将该组件的“区域类Area Class”设置为一个自定义的、通行成本极高的区域或者直接使用“不可行走”区域。关键一步在箱子的蓝图里编写逻辑当箱子被移动时调用该NavModifierComponent的RefreshModifier()函数。这会强制导航系统重新计算该区域更新NavMesh。这个细节在很多教程里不会提但却是实现与动态物体交互的AI导航时必须掌握的技巧。