UDN
Search public documentation:

WaypointsTechnicalGuideCH
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 & 导航 > 路点技术指南

路点技术指南


概述


导航是基于预先生成的路径网络进行的。因为这个路径网络不能 100% 地覆盖机器人可以穿行到达的区域,所以它们也必须可以执行环境的本地评估及导航,为了达到这个目的,它们通过使用碰撞跟踪及碰撞数据结构中的邻近对象检查来进行采样。

关卡设计师应该将 NavigationPoints 放置在地图内。在构建这个关卡的时候, NavigationPoints 将会生成 ReachSpecs ,这其中包含供可以使 AI 从 A 寻路到 B 的寻路使用的数据。

什么是定位点?


Anchor(锚点)是 AI 可以直接到达的导航点,不需要执行寻路,因此这也就是路径搜索开始的地方。在任何种类的路径图表上,寻路的第一步是找到最合适的起始点和结束点,以便在它们之间生成路径。Anchor(锚点)代表着机器人路径搜索的起始点,这样,调用完 FindPathToward() 后,您将会获得一条从锚点到目标点的路径。

Controllers(控制器)


ReachedDestination()

AI 在移动过程中为了判定它是否应该把它当前移向的对象作为 'reached(已到达的)'对象对待时需要询问这个函数。换句话说,AI 调用这个函数来决定它是否应该停止向当前的目的地移动,然后或者继续移动到路径中的下一个对象或者由于它已经到达了所有的目标点而完全地停止移动。注意,该函数会在该 AI 尝试要移动到的 Actor 上调用 ReachedBy() ,它会让自定义对象有机会决定 AI 什么时候应该停止向它移动。一个证明这个函数有用的实例是在非常大的对象上。一般,一个 AI 尝试并运行到对象的位置,直到它处于上述对象的某个范围半径之内为止,但是如果它具有碰撞比它检测的半径大,那么很显然将会导致问题。对于这样的对象,您应该仅重写 ReachedBy() 来考虑它的自定义维度。

ActorReachable()

AI 可以调用这个函数来决定对象是否可以 直接地 到达。这意味着 AI 可以沿着直线跑到这个对象而不需要跑动穿过任何东西(它不能跳过的东西)。这个函数用于在移动过程中决定几个事情,但是有一个很好的实例是当它是用这个函数来决定它是否应该径直跑到它的目标点或尝试通过路径网路寻路到那里。

最好查看源代码来获取实例。那也就是说,从高层次来说,这个函数所进行的操作如下所示:

  1. 通过判定我们检测的 actor 是否在我们所处的 ReachSpec 上,或者判定目的地 actor 是否在我们所在的导航节点的半径的范围内来尝试运行或提前退出。 (假设 到达指标/导航点 始终有效,因为对它们进行了离线验证)。
  2. 进行一次快速的光线投射来判定目的地是否可见,如果不可见则提前退出。
  3. 检测目的地 actor 是否在固体地面的上面。

FindPathToward()

这个函数将执行路径网络的遍历,生成从 AI 的位置到传入的目标点的路线,将生成的路线(从锚点到目标之间的路径节点组成的有序序列)放到控制器的 RouteCache(路线缓存) 中。这将会告诉 AI 为了到达目标点,它需要移动到这个路点上。

FindPathToward() 可以决定如何穿越到一个 actor 处,通过首先确保 AI 的锚点是有效的(如果它不是有效的,则需要尝试查找新的锚点),然后在整个路径网络上穿行来生成从锚点到目标点的路线。 只要生成了这个路线,AI 将会直接朝向路线的第一个节点直接运行,直到 ReachedDestination() 判定它已经到达了该路点为止,然后它将会触发 AI 运行到生成的路线中的下一个路点。

FindPathToward() 仅生成供 AI 使用的路线,所以如果您结果看到机器人剪辑或者环绕的角落、以及变得卡住。 那么最好使用控制台命令 show paths 来查看路线 (ReachSpecs) 是否正在穿过这个角落。

MoveTo()

这是一个 latent 函数,它会把机器人直接地移动到经过的节点,并在到达时结束。 这个函数没有寻路,它只是将 pawn 直接导向目标节点。

MoveToward()

这个函数和 MoveTo() 非常类似,除了它是以一个 actor 作为目的地,并且有一些使用这个额外数据的特殊处理。(如果 AI 正在移向一个导航节点那么将会设置锚点,诸如此类)。