此页面介绍如何在游戏中创建、更新和销毁 TagVolume。
有关障碍物管理系统中 TagVolume 类的作用的介绍,请参见使用动态障碍物和 TagVolume。
有关 NavTag 系统的背景信息,请参见使用自定义数据进行标记。
您需要在游戏中创建一个用于管理初始化和销毁 TagVolume 的类。您的游戏中可能已经有一个类在管理 TagVolume 计划在 Gameware Navigation 世界中表示的对象或玩家角色的寿命。如果是这样,则可以使用该类。
例如:[Tutorial_ObstacleIntegration.cpp 中的代码]
class MyGameTagVolume { public: MyGameTagVolume(): m_navTagVolume(KY_NULL) {} void Initialize(Kaim::World* world); void Destroy(); Kaim::Ptr<Kaim::TagVolume> m_navTagVolume; // We will keep the InitConfig too. This is not necessary, but it is convenient in case // we want to re-create the TagVolume with slightly different settings. Kaim::TagVolumeInitConfig m_navTagVolumeInitConfig; };
要初始化 TagVolume,必须提供 TagVolumeInitConfig 配置类的实例,该实例是使用 TagVolume 所需的数据设置的。您必须以最小值设置:
例如:[Tutorial_ObstacleIntegration.cpp 中的代码]
void MyGameTagVolume::Initialize(Kaim::World* world) { // Set up the TagVolumeInitConfig m_navTagVolumeInitConfig.m_world = world; m_navTagVolumeInitConfig.m_altitudeMin = 10.0f; m_navTagVolumeInitConfig.m_altitudeMax = 11.0f; m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-19.0967f, 7.93156f)); m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-15.3928f, 4.77404f)); m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-11.9082f, 9.46633f)); m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-14.6730f, 16.2140f)); m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-14.5526f, 10.8631f)); m_navTagVolumeInitConfig.m_points.PushBack(Kaim::Vec2f(-18.5613f, 10.9361f)); // This sets the NavTag as non-walkable: it will "cut a hole" in the NavMesh m_navTagVolumeInitConfig.m_navTag.SetAsExclusive(); m_navTagVolumeInitConfig.m_navTag.m_blindDataArray.PushBack(0); // Create and initialize the TagVolume, and add it to the World m_navTagVolume = *KY_NEW Kaim::TagVolume; m_navTagVolume->Init(m_navTagVolumeInitConfig); m_navTagVolume->AddToWorld(); }
TagVolume 类不打算进行更新。使用给定的轮廓和 NavTag 值创建后,它必须保持不变,直到销毁。
如果您需要 TagVolume 表示移动或修改分区(例如洪水在地面上缓慢流动),应当销毁 TagVolume,然后使用新尺寸重新创建。但是,由于涉及将体积合并到 NavMesh 的计算不太常用,因此您不应在每一帧或每隔几帧执行此操作。而是考虑在代码中设置距离阈值,并接受障碍物表示中小于阈值的些许误差。
销毁 TagVolume:
例如:[Tutorial_ObstacleIntegration.cpp 中的代码]
void MyGameTagVolume::Destroy() { m_navTagVolume->RemoveFromWorld(); m_navTagVolume = KY_NULL; }