处理屏幕外AI的好方法?


16

例如,缘故:

  • 假设世界上有10个房间。
  • 假设世界上居住着10个实体。
  • 每个实体都有自己的“例行程序”,在该例行程序中它在房间中执行某些操作,并且还可以在房间之间进行导航。

假设玩家一次只能进入一个房间,那么跟踪其他实体在屏幕外其他房间正在执行的动作的好方法是什么?

  1. 最直接的选择是检查每一帧上的10个实体中的每个实体,检查它们的位置/状态,并确定该实体在任何给定时间是否应位于玩家所在的房间中。 (但是,这确实感觉资源很丰富,尤其是随着房间/实体数量的增加。)
  2. 另一种选择是跟踪自游戏开始以来所经过的时间,然后每个实体检查其模式是否与玩家所在的房间相交,并且是否按照时间检查是否已实体应该在此特定时间位于同一房间中,其图案不与玩家所在的当前房间相交的实体直到玩家进入其图案相交的房间并且仅在该点才计算不执行任何操作他们应该渲染。(但是,如果他们与房间互动,那么他们将必须始终检查与路线相交的房间的状态,以便确定在该时间点的位置,这并不是那么好。)

  3. 我要做的第三个选择是,首先仅查看与玩家位置相交的路线(如前所述),其次进入房间后,检查玩家是否在该房间内,如果不是,则仅检查房间的状态,以及进入下一房间需要多长时间。例如,一个看门人NPC进入房间,检查房间的状态,查看玩家是否有溢出物,计算清理该清理所花费的时间以及该路径需要花费多长时间等。时间是进入下一个房间的时间,我们只会检查玩家是否在房间里。用于渲染目的的NPC的确切位置仅在玩家进入房间时计算。

经过一番集思广益后,我想到了第三个选择,但我想知道是否存在一种已知或更好的方法来处理此类问题?


1
这个问题让我想起了我读过的一个名为Project Zomboid的游戏的开发博客
Sumurai15年

Answers:


12

一种非常简单的方法是使用“ AI细节级别”。粗略地讲,这意味着您越接近播放器/相机,就更频繁地更新AI。您还可以降低更远的AI计算的复杂性,尤其是。寻找路径。毕竟,如果玩家看不见角色或根本看不到角色,那么就不需花费大量精力来以最高准确度模拟角色。

在您的示例中,播放器所在的房间可能获得最高的准确性(AI每帧更新一次,全分辨率)。相邻的房间可能获得次高的精度(每10个滴答声更新一次,删除路径平滑和动画)。其他所有房间的准确性都最低(每秒更新一次,低分辨率的寻路,消除了不必要的NPC到NPC的交互)。

更大,更复杂的游戏可以(并且已经)使用类似的方法。他们可能会简化战斗计算,传送角色,而不是在需要移动时寻找角色,等等。

如果您的游戏足够大,无法始终将整个内容保存在内存中,那么一个好的解决方案是将最近更新时间存储在房间的已保存数据中,并在出现以下情况时在屏幕外(最低分辨率)重播其模拟内容。它已加载回去。

如果您希望AI按计划从卸载的“睡眠”区域移至“活动”区域,则您要么要为这些区域创建超低保真度数据,以随时将其保留在内存中(例如,最粗略的导航详细信息级别和关键对象/字符位置),或者您想定期循环访问这些区域(例如,在内存和模拟中以低保真度保持X个“睡眠”区域,并且不经常更新,然后在所有“ “睡眠”区域,其中包含关键的活动NPC,并在执行此操作时卸载和加载区域)。


1

我将当前在该房间实例中某个房间中的实体存储起来,房间对象还将跟踪何时需要更新哪些实体(例如,旅行到另一个房间或在该房间中进行更改等)。而且我还要每秒更新一个(或多个)房间(也许在另一个线程中)。

更新房间时,应更新NPC位置,并应处理自上次更新以来与房间交互的所有已执行动作,最后应检查/更新下一次需要更新的时间。

如果实体从一个房间旅行到另一个房间,则其实例应存储在另一个房间中,并且该实体的下一次更新也应更新。

这样,您只需要不断更新当前房间以及当时具有预定更新时间的房间,更新其他房间只是可选的(但是如果您的AI会在玩家移动或执行任何操作时进行更新,则建议您这样做) 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.