UDN
Search public documentation:

NavigationMeshPathDebuggingCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3主页 > AI & 导航 > 导航网格物体路径调试

导航网格物体路径调试


概述


由于一般数据集较大以及寻路的复杂性导致调试寻路问题是很困难的。本文档概括出了一些工具来使得过程变得简单。

路径调试渲染


要想启用路径渲染功能,您可以运行控制台命令 show paths(显示路径) 。这将会描画出当前加载的导航网格物体(包括从导航网格物体障碍物的动态更新)。 下面是一个屏幕截图:

showpathsscreenshot.jpg

  • 红色的表面是指障碍物网格物体的表面(AI不能在其上面行走的表面)。
  • 绿色的表面是可以行走的表面(导航网格物体本身的一部分)。
  • 在多边形之间沿着边界的紫色的线是指多边形之间的连接。如果在两个邻近的多边形之间没有紫色的线,那么AI将不能从一个多边形到另一个多边形。
  • 其它的不同边缘类型的线(比如,黄色的虚线)。在这个例子中,黄色的虚线是指条状盖板的边缘。

在Pylon上,您也可以找到一些有用的调试选项:

  • bDrawEdgePolys -当它的值为TRUE时,将会从边缘的中心向连接两个多边形的边缘的中心描画一条线。这对于调试哪些多边形正在和哪些边连接是有用的。这里是打开这项的屏幕截图:
    showpathsscreenshot_edgepolys.jpg
  • bDrawPolyBounds -当这项为真时,将会描画黄色的线框,它是指计算出的每个多边形的边界。屏幕截图:
    showpathsscreenshot_showbounds.jpg

同时请参照使用导航网格物体页面获得更多的信息。

bDebugConstraintsAndGoalEvals


在navigationhandle(导航手柄)上存在一个布尔值,当设置这项为TRUE时,将会使得那个导航手柄的寻路输出关于路径搜索的统计数据。

这里是一个实例,它显示了当设置bDebugConstraintsAndGoalEvals为真时,它是从一个简单最短路径搜索的输出的统计数据。

[0515.02]Log:------- PATH CONSTRAINT STATS(路径约束数据统计) --------
[0515.02]Log:Processed:43 ThrownOut:0 (0.00% thrown out) AddedPathCost:0.00 (0.00% total) AddedHeuristic:0.00 (0.00% total) - (NavMeshPath_MinDistBetweenSpecsOfType_0)
[0515.02]Log:Processed:43 ThrownOut:0 (0.00% thrown out) AddedPathCost:0.00 (0.00% total) AddedHeuristic:175.00 (100.00% total) - (NavMeshPath_Toward_0)
[0515.02]Log:--------------------------------------
[0515.02]Log:TotalThrownOut:0 TotalAddedDirectCost:0.00 TotalAddedHeuristicCost:175.00
[0515.02]Log:------- GOAL EVALUATOR STATS --------
[0515.02]Log:Threw Out 10 (out of 11 processed (90.91%)) (Responsible for 100.00% of all nodes thrown out) - NavMeshGoal_At_0
[0515.02]Log:---------------------------------------

从这个输出数据中,您可以获得很多信息。比如,如果我们在路径约束类表中有一个故障限制,它拒绝了所有的节点,通过查看统计数据我们可以看到那是一个错误行为。这也会输出关于增加系统消耗的约束,以便您可以看到哪个约束对路径检索由最大的影响等…..。

bUltraVerbosePathDebugging


注意: 这个代码在QA_APPROVED_BUILD_DEC_2009版本中出现,代码的迁入变更列表是CL 408369。

当您仍然不知道当前的运行状态或者为什么一个实体不能寻路到一个位置时,可以打开bUltraVerbosePathDebugging项。当启用这项后,在下次启用AI寻路时,代码将会把调试信息描画到屏幕上,并且会把输入到屏幕上的信息保存到日志中。

屏幕调试信息应该可以帮助您看到路线的总体形状并且可以知道寻路进行到了什么地方以及它检查了哪些节点。当然,通过试用屏幕上的标签,您可以获得关于特定事件的更多细节信息。

请参照以下的屏幕截图:
UltraVerbosePathDebuggingScreenshot.jpg

  • Red lines(红线) -指出了被拒绝的路径行走路径。
  • Red Text(红色文字) -它是和那个行走失败的路线相对应的输入到日志输出行中进行查找的关键字。比如,如果您在边缘上看到C:21,您或许想知道AI为什么不能通过,可以在您的日志窗口中输入C:21进行搜索,然后您便找到原因。以下是个日志行的实例: [0061.15]Log:PATH_DEBUG_MESSAGE[C:21]:边缘不支持这个实体(支持返回为FALSE) Edge:FNavMeshEdgeBase (Len:30.00 EffecLen:30.00)。
  • Green lines(绿线) -是指成功地从一个多边形穿越到另一个多边形。
  • White Text(白色字体) -是用于输入日志输入命令行关键字,该关键字和调用EvaluateGoal 失败(没有终止)相对应。一个实例,日志行(log line): [0061.15]Log:Poly (P:16) (polyctr:X=13905.000 Y=-13110.000 Z=129.000)仅是NavMeshGoal_At_0的给定状态[EvaluateGoal返回0]。
  • DebugCoordinateSystem(调试坐标系统) - 在SearchStart处描画。
比如,在这个屏幕截图中,如果我想知道为什么标记为C:22的边缘不允许AI通过它,我将需要在调试输出中所搜C:22,然后我将找到以下信息:
[0132.83]Log:PATH_DEBUG_MESSAGE[C:22]:边缘不支持这个实体(支持返回为FALSE) Edge:FNavMeshCoverSlipEdge (Actor:CoverLink_8 RelItem:0 MoveDir:-1)

这里是另一个屏幕截图,展示了正在工作中的调试模式的较宽的视图:

ultraverbose_wide.jpg

在这个模式中,也会打印许多其它的相关信息,比如,在每个路径步伐中设置大小,以及路径检索终止的原因。这里是一些示例输出:

[0132.82]Log:Poly (P:108) (polyctr:X=12828.750 Y=-15367.500 Z=-127.000) was just given status [EvaluateGoal returned 0] by NavMeshGoal_SquadFormation_0
[0132.82]Log:PATH_DEBUG_MESSAGE[C:221]:Path constraint NavMeshPath_WithinTraversalDist_0 EvaluatePath rejected this edge! Edge:FNavMeshEdgeBase (Len:60.00 EffecLen:90.00)。
[0132.82]Log:PATH_DEBUG_MESSAGE[C:222]:边缘不支持这个实体(支持返回为FALSE) Edge:FNavMeshEdgeBase (Len:15.00 EffecLen:30.00)。
[0132.82]Log:PATH_DEBUG_MESSAGE[C:223]:边缘不支持这个实体(支持返回为FALSE) Edge:FNavMeshEdgeBase (Len:15.00 EffecLen:30.00)。
[0132.82]Log:+++Finished path step 108!, Openlist now has 2 nodes in it.
[0132.82]Log:Poly (P:109) (polyctr:X=12105.000 Y=-13860.000 Z=127.750) was just given status [EvaluateGoal returned 0] by NavMeshGoal_SquadFormation_0
[0132.82]Log:PATH_DEBUG_MESSAGE[C:224]:Path constraint NavMeshPath_WithinTraversalDist_0 EvaluatePath rejected this edge! Edge:FNavMeshEdgeBase (Len:60.00 EffecLen:90.00)。
[0132.82]Log:PATH_DEBUG_MESSAGE[C:225]:边缘不支持这个实体(支持返回为FALSE) Edge:FNavMeshEdgeBase (Len:15.00 EffecLen:30.00)。
[0132.82]Log:+++Finished path step 109!, Openlist now has 1 nodes in it.
[0132.82]Log:Poly (P:110) (polyctr:X=13800.000 Y=-14482.500 Z=-127.000) was just given status [EvaluateGoal returned 0] by NavMeshGoal_SquadFormation_0
[0132.82]Log:PATH_DEBUG_MESSAGE[C:226]:Path constraint NavMeshPath_WithinTraversalDist_0 EvaluatePath rejected this edge! Edge:FNavMeshEdgeBase (Len:60.00 EffecLen:120.00)。
[0132.83]Log:PATH_DEBUG_MESSAGE[C:227]:边缘不支持这个实体(支持返回为FALSE) Edge:FNavMeshEdgeBase (Len:15.00 EffecLen:30.00)。
[0132.83]Log:PATH_DEBUG_MESSAGE[C:228]:Path constraint NavMeshPath_WithinTraversalDist_0 EvaluatePath rejected this edge! Edge:FNavMeshEdgeBase (Len:60.00 EffecLen:120.00)。
[0132.83]Log:PATH_DEBUG_MESSAGE[C:229]:Path constraint NavMeshPath_WithinTraversalDist_0 EvaluatePath rejected this edge! Edge:FNavMeshEdgeBase (Len:75.00 EffecLen:105.00)。
[0132.83]Log:PATH_DEBUG_MESSAGE[C:230]:边缘不支持这个实体(支持返回为FALSE) Edge:FNavMeshCoverSlipEdge (Actor:CoverLink_48 RelItem:0 MoveDir:-1)
[0132.83]Log:+++Finished path step 110!, Openlist now has 0 nodes in it.
[0132.83]Log:+++++++++ STOPPING PATH SEARCH -- Nodes on openlist:0 Reason:Path finished, and DetermineFinalGoal returned TRUE.. search was a success!

当然,已经建立了一个可以轻松地在游戏运行时启动特定AI上的调试模式的快速工具。 VerbosePathDebug 是个控制台命令,您可以运行它,从而可以描绘出玩家正在看向的地方,并且会设置路径中的任何pawns的bUltraVerbosePathDebugging为真。

当为一个AI启用这个工具并且那个AI完成了寻路时,之前的非常冗长的调试信息将会被冲掉,从而为新的信息让出控件,同时游戏将会处于仅玩家模式,是您可以挖掘更多的信息。请记住,如果在一帧中发生了多次寻路,那么您看到的描画的屏幕上的路径是最后一次发生寻路的路径。