c# - 寻找离源最近的物体。(解释问题)
问题描述
我有这段代码,我基本上从一个非常古老的帖子中得到了这个论坛的帮助,但我有一个关于它是如何工作的问题。代码中有一部分我们声明了一个浮点数Mathf.Infinity
,我们检查源和所有对象(for循环)之间的距离是否小于该浮点数,然后我们返回该对象,但这如何真正指定这是最近的目标吗?(dSqrToTarget < closestDistanceSqr)
?
public GameObject GetClosestEnemy(List<GameObject> enemies, Transform fromThis)
{
if (enemiesList == null) return null;
GameObject bestTarget = null;
float closestDistanceSqr = Mathf.Infinity;
Vector3 currentPosition = fromThis.position;
foreach (GameObject potentialTarget in enemies)
{
Vector3 directionToTarget = potentialTarget.transform.position - currentPosition;
float dSqrToTarget = directionToTarget.sqrMagnitude;
if (dSqrToTarget < closestDistanceSqr )
{
closestDistanceSqr = dSqrToTarget;
bestTarget = potentialTarget;
}
}
return bestTarget;
}
解决方案
的用途Mathf.Infinity
只是将变量初始化为某个无效的起始值,该值将大于您测量的实际对象之间的任何距离。如果它是一个引用类型,那么在这种情况下这将等同于 a null
。
Vector3 directionToTarget = potentialTarget.transform.position - currentPosition;
float dSqrToTarget = directionToTarget.sqrMagnitude;
这部分在这里使用基本矢量数学测量 3D 空间中两个对象之间的距离。
if (dSqrToTarget < closestDistanceSqr )
{
closestDistanceSqr = dSqrToTarget;
bestTarget = potentialTarget;
}
将计算出的距离与当前“最近”对象进行比较。由于初始值为“无效”,第一个对象将始终被视为“可能最接近”并存储。循环中的后续对象将继续检查比较。如果它们更接近,则将它们存储在bestTarget
值中。如果不是,则循环继续,直到没有更多对象需要检查。
循环结束后,bestTarget
返回 的值,因为它保存了在循环中找到的任何东西的最小距离。
推荐阅读
- heroku - Heroku 的免费计划适用于测试任务/宠物项目吗?
- android - 创建一个构建 Android 映像的符号链接
- java - 我可以将列表中的每个元素分配给单独的变量吗?
- apache-kafka - 使用骆驼从kafka消费消息时应用程序崩溃
- android - 我能够在android中从另一个线程而不是主线程更新ui
- ruby-on-rails - 无法直接访问 KVM Guest,但 VS Code remote-ssh 可以
- java - GridBagLayout 奇怪的行为
- c# - 如何仅使用其数据绑定类从 ListBoxItem 访问按钮/标签?
- node.js - AWS CloudTrail lookupEvents 不适用于 StartTime 和 EndTime 节点 js。获取所有事件而不是按时间过滤事件
- python - Openpyxl 创建具有工作表名称和特定单元格值的数据框?