使用检查点

检查点是沿路径的事件,只有在验证检查点之后,路径跟随系统才视为到达。您可以将任何 PathEvent 标记为检查点。一旦人物采用检查点作为其目标点,则只有在验证检查点之后,PathFollower 才会沿路径推进目标点。

检查点系统的典型用例是在某些类型的事件的给定距离内强制角色靠近,然后才能沿其路径继续前进。但是,您可以使用并扩展该系统以标记想要作为检查点的任何事件,并自定义用于验证已到达检查点的条件。

有关 PathEvent 的背景信息及检索方式,请参见监视 PathEvent

默认检查点行为

标识检查点

默认情况下,如果未提供自己的 IPathEventListObserver 的自定义类(请参见监视 PathEvent),Bot 将自动设置为使用 DefaultPathEventListObserver 类的实例。此观察器将下列事件设置为检查点:

  • 链接到 NavGraph 顶点的每个事件。
  • 将 NavMesh 连接到跨 NavMesh 外边界的路径边的每个事件。
  • 位于 NavMesh 边界外的路径中的每个节点。

验证检查点

每个人物均使用用于实现 IPositionOnPathValidator 接口的类实例来确定到达其检查点的时间。默认情况下,如果未提供您自己的自定义实现,人物将自动设置为使用 PositionOnPathCheckPointValidator 的实例。仅当人物比为人物设置的 PathFollowerConfig::m_checkPointRadius 参数值更靠近检查点事件时,该默认实现才将检查点视为到达。

标识您自己的检查点

可通过调用其 PathEvent::SetCheckPointStatus() 方法将任意 PathEvent 设置为检查点。

// make the event into a check point
m_pathEvent->SetCheckPointStatus(Kaim::CheckPointStatus_EventIsACheckPoint);

// make the event not a check point
m_pathEvent->SetCheckPointStatus(Kaim::CheckPointStatus_EventIsNotACheckPoint);

您可以随时对从角色的 PathEventList 中检索的任何事件执行该操作。

根据想要使用检查点的方式,您还可以创建自己的 IPathEventListObserver 类,以在每次创建新路径时自动标记检查点。有关实现和设置此接口的详细信息,请参见监视 PathEvent。请记住,除非将相同代码包含在您的实现中,或从 DefaultPathEventListObserver 派生类,并在父类中调用方法实现,否则更改默认观察器将更改将某些类型的事件自动标记为检查点的默认行为(见上文)。

自定义检查点验证

可通过两种方法来定义为角色验证检查点的方式。

距离阈值

如果您只是想配置检查点视为成功到达时的阈值,请为 PathProgressConfig::m_checkPointRadius 配置参数设置新值。请参见自定义路径跟随

自定义条件

如果要使用您自己的自定义条件来验证检查点已到达,而非使用简单的距离阈值,请执行以下操作:

  1. 编写您自己的用于实现 IPositionOnPathValidator 接口的类。在这里,您可以设置用于测试给定的 Bot 是否已达到给定检查点的逻辑。
  2. 编写从 BaseNavigationProfileNavigationProfile 类派生的您自己的类,并使 BaseNavigationProfile::GetSharedPositionOnPathValidator() 实现返回一个指向 IPositionOnPathValidator 类实例的指针。
  3. 设置 WorldBots 以使用新的 NavigationProfile。有关详细信息,请参见 自定义路径跟随