此页面提供有关在一个世界中同时使用多个数据库的一些详细信息。
仅当您使用的多个不同类型的角色具有以下特点时,才需要使用多个数据库:
在这样的情形下,两种类型的角色可导航的地形区域的差异足以说明有必要使用两个 NavData 集,这意味着在游戏中在运行时使用两个数据库管理不同的 NavData 集。
通常,为地形预先生成的静态 NavData 在使用 Gameware Navigation 时消耗的运行时内存最多。因此,为避免不必要的重复,您可能希望让您的角色在可能的情况下(例如,角色之间的差异非常小,在运行时不会导致明显的异常行为)共享相同的 NavData。
如果您选择在不同类型的角色之间共享同一个数据库,则使用最大角色的半径和高度来生成数据是最安全的。以人和巨人为例,这一点很容易理解:
在这种情况下,需要在两方面做出权衡,一方面通过共享 NavData 来节省运行内存,另一方面通过根据每个角色的精确尺寸调整 NavData 来增加寻径和路径跟踪的真实性。最终,由您决定在游戏中哪些角色应该有优先权。
在世界中设置多个数据库在概念上与设置单个数据库相同,但您必须执行多次操作:
唯一真正的区别是增加了对资源管线的挑战,因为需要确保将每种类型的角色的 NavData 添加到正确的数据库。
数据库提供了一种机制,用于确保数据集的连贯性,并防止您加载为其他角色生成的 NavData。一个数据库一旦加载了任何 NavData,将不再加载任何其他 NavData,除非生成的其他 NavData 与现有 NavData 具有相同的配置参数集。
在将 NavData 对象添加到数据库之前,可通过调用 Database::IsCompatibleWith() 命令并传递 NavData 对象来测试该数据与已存在的数据是否匹配。如果该方法返回 false,则将该 NavData 添加到此数据库的尝试将失败。
默认情况下,将新 WorldElement(例如人物或障碍物)添加到世界时,该对象将空间化到世界的所有数据库中。这样可确保所有数据库按照相同的方式考虑新对象。例如:
但是在某些情况下,用户可能不想发生该默认行为,而是希望对应用新对象的数据库加以限制。例如:
每次创建人物、BoxObstacle、CylinderObstacle、TagVolume 或 PointOfInterest 时,可以指定应考虑新对象的数据库。
用于初始化这些类型的对象的配置对象拥有 m_databaseBinding 成员,该成员具有 DatabaseBinding 类的实例。初始化对象之前,您可以新建 DatabaseBinding,通过将指针指向选择的数据库进行设置,然后将 m_databaseBinding 成员设置为指向 DatabaseBinding。例如:
Kaim::BotInitConfig botInitConfig; ... m_databaseBinding = *KY_NEW Kaim::DatabaseBinding; m_databaseBinding->AddDataBase(world->GetDatabase(0)); m_databaseBinding->AddDataBase(world->GetDatabase(2)); botInitConfig.m_databaseBinding = m_databaseBinding; m_navBot->Init(botInitConfig);