我应该如何实现单位的​​敌人“意识”?


12

我正在使用Unity3d开发RTS / TD混合原型游戏。在单位与敌人之间进行“意识”的最佳方法是什么?让每个单位检查到每个敌人的距离并在范围内交战是否明智?

我现在要采用的方法是在每个单元上都有一个触发范围。如果有敌人进入扳机,则部队会察觉到敌人并开始距离检查。这样可以节省一些不必要的检查吗?

最佳做法是什么?


我应该补充说,单位/敌人的数量将在最高统帅部的范围内
Phil

Answers:


10

查看边界体积层次结构(BVH)。它们最常用于碰撞检测中,以减少计算碰撞时所需的检查次数,或用于对对象执行视锥剔除的渲染。由于您已经在使用球体,因此我建议使用球体树,尽管其他体积(例如AABB)可能更有效。我不确定Unity对我从未使用过的东西提供什么样的支持,但是在碰撞检测或引擎渲染部分中可能已经对此有所支持。

基本上,您希望将彼此靠近的敌人组合到多个父球体中。当一个单位被移动时,您将检查其触发球体是否与父球体相对,而不是检查每个敌人。如果触发球与父球相交,则应检查其中的每个敌人。如果不是,则可以丢弃其中的所有敌人。您可能希望根据最大球体尺寸或每个球体的敌人数来设置多个球体级别,然后根据顶级球体执行检查。然后,只需走到树上即可检查每个敌人,而无需对每个敌人执行距离检查。

每个框架所需的步骤:

  1. 移动敌人
  2. 重建/更新BVH以获取新的敌方阵地
  3. 移动单位并对照球面树进行检查。

当有很多敌人时,这可以减少所需的检查,但是当没有那么多敌人时,更新和存储树的开销可能不值得。我不熟悉Supreme Commander知道您要干什么,所以我只是假设“数百”。您需要在不同情况下进行概要分析,以了解开销是否值得您负担。


3
+1这种方法将是最简单的,尽管会出现一些错误。OP可能想要实现此功能,然后实现类似八叉树的功能。同样,在大多数RTS中,这些单元会有所延迟。实际上,大多数游戏中的AI都是以每秒10-30帧的速度计算的,而游戏可能以每秒30-60帧的速度运行(数字当然是近似值)。
Samaursa,2010年

谢谢,这正是我需要进一步迈出的一步。我将查找BVH以及如何在Unity中实现它。非常教学和翔实的帖子!+1
Phil

哦,如果您要使用RTS,请查看Supreme Commander。与所有Chris Taylor游戏一样,这确实是一个非常不错的游戏。
Phil

7

无需实施BVH,因为Unity的碰撞引擎实际上已经为您做到了。

只需在每个单位上附加一个大的包围圈触发器(代表其范围),并处理OnCollisionEnter()OnCollisionExit()回调以跟踪哪些敌人在每个单位的范围内。

请注意,您感兴趣的情况是其他单位与球体碰撞时,而不是其他单位的球体与球体碰撞时。


1
我认为这需要至少提高到接受的答案之上。接受的答案对学习很有帮助,但是此答案应该放在最上面,因为这是最实用的方法。
Varaquilex

我相信你的意思是OnTriggerEnter()OnTriggerExit(),对不对?
Jibb Smart 2015年

1

可以很好地缩放并且可以用于许多其他事情的另一个解决方案是影响图。在单元周围生成一组网格图块,以在X半径内进行扫描。扫描这些图块以查找站在其中一个上的敌人。如果您想找到最接近的敌人,则可以按距离对集合进行排序。

这可能是最有效的方法,尤其是如果您打算对影响图进行其他操作,例如战争迷雾或寻路。

这是我制作的解释该概念的视频:https : //www.youtube.com/watch?v=MEd6XV2Pecw

这是一个实现:https : //www.youtube.com/watch?v=y_ewoxlZlgc

我建议不要在启动时初始化网格图块的单元集合-而是仅在需要集合时初始化。

另外,如果您知道图块上的X单位不会超过X个单位,则可以使用X个长度的数组。

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.