获取静态路径

此页面介绍了设置 Bot 的可能方法,带有一个静态 Path 供其跟随,按照由简单到复杂的顺序排列。

基本:使用默认的 A* 查询

这是计算新路径的最简单方法,通常建议用于初始集成。例如,如果按照集成教程中的说明进行操作(请参见将 Navigation 集成到游戏引擎),则已使用此方法设置了一个人物

在此方法中,您只需调用 Bot::ComputeNewPathToDestination(),并指定目标位置。人物透明地执行以下操作:

请注意,如果已在进行路径计算,则先前的请求会自动取消。

例如:

void MyGameEntity::Goto(Kaim::Vec3f destination)
{
    // Clear the followed path
    m_navBot->ClearFollowedPath();

    // Request the new path computation
    m_navBot->ComputeNewPathToDestination(destination);
}

高级:动态自定义 Astar 查询

上面所示的路径计算方法可以使用简单的 API 处理最常用的路径计算情景,非常适用于快速集成和运行。但是,您必须使用具有预设的默认行为的 AStarQuery 类。您最终可能会发现您的项目要求您动态自定义由 AStarQuery 提供的选项和设置,或按照不是在可以为 Bot 设置的寻径配置参数中公开的方式设置查询。请参见AStarQuery 选项

要了解这些可能性,可以使用 Bot 类提供的“高级”路径计算 API。但是,使用此方法时需要更加小心。

在此方法中:

人物请求在下次更新 World 时异步启动查询。

请注意如果已在上一帧中针对 Bot 启动路径计算且先前的计算尚未完成,则对 Bot::ComputeNewPathAsync() 的调用将失败。在调用 Bot::ComputeNewPathAsync() 之前,应该通过调用 Bot::IsComputingNewPath() 来测试当前是否正在运行计算。如果此方法返回真值,则应该跳过新的寻径请求,或通过调用 Bot::CancelAsyncPathComputation() 来取消先前的请求。

例如:

class MyGameEntity
{
    void Initialize(Kaim::World* world);
    void Goto(Kaim::Vec3f destination);
    Kaim::Ptr<Kaim::BaseAStarQuery> m_aStarQuery;
};

void MyGameEntity::Initialize(Kaim::World* world)
{
    ...
    // We create and assign the query
    m_aStarQuery = m_navBot->GetFollowedPathNavigationProfile()->CreateAStarQuery();
 
    // Bind the query to the Database used by the Bot
    m_aStarQuery->BindToDatabase(m_navBot->GetDatabase());
 
    // Set up configuration parameters for the query, if desired
    m_aStarQuery->SetTryCanGoMode(Kaim::ASTAR_DO_TRY_RAYCANGO);
}

void MyGameEntity::Goto(Kaim::Vec3f destination)
{
    if (m_navBot->IsComputingNewPath())
    {
        m_navBot->CancelAsyncPathComputation();
    }

    // Clear the followed path
    m_navBot->ClearFollowedPath();

    // Set the inputs of the path finding query
    m_aStarQuery->Initialize(m_navBot->GetPosition(), destination);

    // Adjust other parameters on the fly if necessary
    m_aStarQuery->SetPropagationBoxExtent(200.0f);

    // Request the new path computation
    m_navBot->ComputeNewPathAsync(m_aStarQuery);
}

高级:使用其他寻径查询类

如果出于某种原因,默认的 AStarQuery 类不符合您的需求,您可以使用其他寻径查询。有关 SDK 中提供的其他查询类的详细信息以及有关如何编写自己的查询的概述,请参见备用寻径查询

若要设置 Bot 以使用您的查询,请按照上一部分中所述的类似过程进行操作。但是,在这种情况下,您不应从 NavigationProfile 检索查询,而且您需要设置更多内容,以确保生成的路径与人物的路径跟随系统兼容。

人物请求在下次更新 World 时异步启动查询。

请注意如果已在上一帧中针对 Bot 启动路径计算且先前的计算尚未完成,则对 Bot::ComputeNewPathAsync() 的调用将失败。在调用 Bot::ComputeNewPathAsync() 之前,应该通过调用 Bot::IsComputingNewPath() 来测试当前是否正在运行计算。如果此方法返回真值,则应该跳过新的寻径请求,或通过调用 Bot::CancelAsyncPathComputation() 来取消先前的请求。

高级:插入现有路径

有时,您可能希望角色使用已经计算好的路径,而不是让角色计算新路径。例如,这可以是由不同的人物计算的路径、通过直接运行寻径查询自己计算的路径、已经预计算并保存在某个位置的类成员中的路径,或甚至是您自己随时构建的 路径(但是通常不建议使用)。

可以通过在调用 Bot::InjectNewPath() 时传递 Path 对象,指示 Bot 跟随现有路径。例如:

Kaim::Path::CreateConfig myPathCreateConfig;
myPathCreateConfig.m_nodesCount = 2;

Kaim::Ptr<Kaim::Path> myPath = Kaim::Path::CreatePath(myPathCreateConfig);
myPath->SetNodePosition(0, Kaim::Vec3f(0.0f, 0.0f, 0.0f));
myPath->SetNodePosition(1, Kaim::Vec3f(1.0f, 1.0f, 0.0f));
myPath->SetPathEdgeType(0, Kaim::PathEdgeType_OnNavMesh);

m_navBot->InjectNewPath(myPath);

请注意,为了确保人物使用的路径跟随系统与用于生成路径的设置兼容,每个 Path 均维护着要跟随该路径所必须使用的 NavigationProfile 的唯一 ID。只要 Bot 跟随插入的路径,其路径跟随系统将自动使用该 NavigationProfile 以检索其应该用于控制路径跟随的所有可自定义对象,如 TraverseLogic 和 IPathEventListObserver

默认情况下,您从头创建的新 Path 对象将设置为使用 World 维护的默认 NavigationProfile。如果新 Path 对于其跟随的路径有任何要求使用自定义 NavigationProfile 的特殊要求,则必须通过调用 Path::SetNavigationProfileId() 在您的 Path 中设置相应的轮廓 ID。