Answers:
查看边界体积层次结构(BVH)。它们最常用于碰撞检测中,以减少计算碰撞时所需的检查次数,或用于对对象执行视锥剔除的渲染。由于您已经在使用球体,因此我建议使用球体树,尽管其他体积(例如AABB)可能更有效。我不确定Unity对我从未使用过的东西提供什么样的支持,但是在碰撞检测或引擎渲染部分中可能已经对此有所支持。
基本上,您希望将彼此靠近的敌人组合到多个父球体中。当一个单位被移动时,您将检查其触发球体是否与父球体相对,而不是检查每个敌人。如果触发球与父球相交,则应检查其中的每个敌人。如果不是,则可以丢弃其中的所有敌人。您可能希望根据最大球体尺寸或每个球体的敌人数来设置多个球体级别,然后根据顶级球体执行检查。然后,只需走到树上即可检查每个敌人,而无需对每个敌人执行距离检查。
每个框架所需的步骤:
当有很多敌人时,这可以减少所需的检查,但是当没有那么多敌人时,更新和存储树的开销可能不值得。我不熟悉Supreme Commander知道您要干什么,所以我只是假设“数百”。您需要在不同情况下进行概要分析,以了解开销是否值得您负担。
无需实施BVH,因为Unity的碰撞引擎实际上已经为您做到了。
只需在每个单位上附加一个大的包围圈触发器(代表其范围),并处理OnCollisionEnter()
和OnCollisionExit()
回调以跟踪哪些敌人在每个单位的范围内。
请注意,您感兴趣的情况是其他单位与球体碰撞时,而不是其他单位的球体与球体碰撞时。
OnTriggerEnter()
和OnTriggerExit()
,对不对?
可以很好地缩放并且可以用于许多其他事情的另一个解决方案是影响图。在单元周围生成一组网格图块,以在X半径内进行扫描。扫描这些图块以查找站在其中一个上的敌人。如果您想找到最接近的敌人,则可以按距离对集合进行排序。
这可能是最有效的方法,尤其是如果您打算对影响图进行其他操作,例如战争迷雾或寻路。
这是我制作的解释该概念的视频:https : //www.youtube.com/watch?v=MEd6XV2Pecw。
这是一个实现:https : //www.youtube.com/watch?v=y_ewoxlZlgc
我建议不要在启动时初始化网格图块的单元集合-而是仅在需要集合时初始化。
另外,如果您知道图块上的X单位不会超过X个单位,则可以使用X个长度的数组。