监视 PathEvent

PathEvent 概述

每个人物所拥有的 LivePath 会维护一个列表,其中包含沿路径的各类事件:

每个事件都由 PathEvent 对象来表示。LivePath 会保留 PathEventListPathEvent 的已创建索引的列表,以及事件之间“间隔”的已创建索引的列表。您可以使用 PathEvent 对象保留的数据成员以确定该对象表示的事件的类型,查找其 3D 位置,获取并设置其检查点状态(请参见使用检查点)等等。

浏览 PathEventList

您可以通过调用 Bot::GetPathEventList() 在 LivePath 上检索完整的事件列表。然后,您可以使用 PathEventList 类的方法来循环访问列表中的所有事件。

使用目标点

PathEvent 的完整列表包括位于人物当前位置和目标点(例如下边界)后面的事件,以及人物已经通过或选择捷径通过的任何事件。您可能想知道即将发生和已忽略的事件。例如,您可能只关心在一定距离内沿路径向前的事件。

您可以使用当前目标点来确定位于人物前面的事件。

  1. 调用 Bot::GetProgressOnLivePath() 以获取 PositionOnLivePath 对象,该对象代表路径上路径跟随系统认为 Bot 已达到的当前点。
  2. 调用 PositionOnLivePath::GetOnEventListStatus() 方法以确定当前前进点位于事件上 (OnEventListStatus_OnEvent) 还是位于两个事件之间的间隔上 (OnEventListStatus_OnInterval)。
  3. 调用 PositionOnLivePath::GetOnEventListIndex() 方法以获取在总体 PathEventList 中的事件或间隔的索引。索引低于此值的任何事件或间隔都位于人物后面;而索引高于此值的任何事件或间隔都将出现在路径上。

    您也可以调用 PositionOnLivePath::GetNextPathEventIdx()PositionOnLivePath::GetPrevPathEventIdx()。然而,有关返回值解释的详细信息,请参见 API 参考中的描述。

获取下一个 NavTag

通常,您真正需要知道的信息项目只是与下一个事件相关联的 NavTag。例如,如果 NavTag 与某个智能对象相关联,您可能希望人物开始请求智能对象以获取指令。

您只需调用 Bot::GetUpcomingEventNavTag() 便可确定下一个事件的 NavTag,无需直接与 PathEventList 进行交互。

注册以通知新 PathEvent

您可以在初始化人物时注册一个自定义事件观察器对象,而不是主动检查路径事件列表以测试是否存在某些情况。每当人物创建、更新或销毁 PathEventList 时都会调用此观察器的方法,从而使您可以响应新路径上的事件。

这可能有助于实施需要执行的自定义初始化步骤,例如向自定义智能对象注册和注销您的人物。例如,如果新路径使用会在游戏过程中关闭的门,您可能希望向控制门的对象注册人物。这样,当门关闭后,门就会通知已计划使用它的角色。您的角色可能会通过触发路径重新计算来对此做出响应。

使用此方法:

  1. 编写派生自 IPathEventListObserver 并实现其虚拟方法的自定义类。
  2. 编写从 BaseNavigationProfileNavigationProfile 类派生的您自己的类,并使 BaseNavigationProfile::GetSharedPathEventListObserver() 实现返回一个指向 IPathEventListObserver 类实例的指针。
  3. 设置 WorldBots 以使用新的 NavigationProfile。有关详细信息,请参见 自定义路径跟随

有关代码示例,请参见 Tutorial_NavTag.cpp 文件。

有关示例实现,请参见 DefaultPathEventListObserver 类。如果您未如上所述提供自己的观察器,默认 NavigationProfile 类会使用 DefaultPathEventListObserver 的实例,这会将对应于 NavGraph 顶点或 NavMesh 和路径边之间的过渡(越过 NavMesh 外部边界)的每个事件标记为检查点。默认情况下,这使角色无需使用捷径即可接近并跟随 NavGraph 边。如果要在自己的实现中保留此行为,请考虑从 DefaultPathEventListObserver 派生您的类,然后从自己类的方法中调用其界面实现。

有关检查点的详细信息,另请参见使用检查点