C# + Unity - 从类列表中的变量中获取最小值[重复]
Posted
技术标签:
【中文标题】C# + Unity - 从类列表中的变量中获取最小值[重复]【英文标题】:C# + Unity - Getting the MIN value from a variables inside a List of Classes [duplicate] 【发布时间】:2021-02-06 00:33:44 【问题描述】:我有这个类的列表:
public class EachEnemy
public GameObject enemy;
public Vector3 coords;
public float distance;
他们会计算到船的“距离”。 随着敌人的生成和移动,距离变量一直在变化。
我需要在该类的列表中找到最小的距离,以及它的索引,以便我可以瞄准 Enemy 对象。
【问题讨论】:
morelinq.github.io/1.x/ref/api/html/… 【参考方案1】:你可以用Linq OrderBy
点赞
using System.Linq;
...
// Wherever you get this from
List<EachEnemy> allEnemies;
// Sorted by the distance to this object
var sortedEnemies = allEnemies.OrderBy(enemy => (transform.position - enemy.coords).sqrMagnitude);
// Or depending on how your class is used simply
//var sortedEnemies = allEnemies.OrderBy(enemy => enemy.distance);
// This would return null if the list was empty
// Or the first element of the sorted lost -> smallest distance
var nearestEnemy = sortedEnemies.FirstOrDefault();
注意使用
OrderBy(enemy => (transform.position - enemy.coords).sqrMagnitude);
会比首先实际计算距离更有效,因为它会跳过对所有向量 sqrMagnitude
s 使用平方根。因为a > b
也暗示了a² > b²
,并且我们知道幅度总是正的,所以知道所有增量向量的sqrMagnitude
s 就足以对它们进行排序。
这样做的好处是你还可以获得第二和第三近的敌人等。
【讨论】:
尽管如此,在 O(n) 可行的情况下实现 O(n log n) 是没有意义的。数据不需要排序; OP 只想要具有最小值的项目,可以在线性时间内找到。【参考方案2】:float smallestDistance = eachEnemyList[0].distance;
int index = 0;
for(int i = 1; i < eachEnemyList.Count; i++)
if(eachEnemyList[i].distance < smallestDistance)
smallestDistance = eachEnemyList[i].distance;
index = i;
这可能没有完美优化,但应该没问题。这为您提供了最小距离和包含最小距离的 EachEnemy 类的索引。
【讨论】:
【参考方案3】:您可以遍历列表中的每个项目并在循环外保存值,也可以将索引保存在循环外,例如
EachEnemy someFuncname(List<EachEnemy> list)
int index = 0;
EachEnemy ea = null;
float distance = 9999 ///
foreach (var Enemy in list)
if (Enemy.Distance < distance)
ea = Enemy;
return ea;
同样的方法也可以返回索引。
【讨论】:
以上是关于C# + Unity - 从类列表中的变量中获取最小值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在unity5中,用c#脚本如何获取UGUI中Input field中的文本?