如何获取距离transform.position最近的X个Collider物体?
获取命中Collider集合中最近的N个物体(可扩展数量)
下面提供两种实现方式,都能满足你获取最近4个(可自定义数量)Collider的需求,返回数组且无需排序:
方法一:基于原有循环手动维护(高效,适合大集合)
这种方法无需全量排序,只维护当前最近的N个物体,性能更优,适合hitColliders数量较多的场景:
// 可自定义需要获取的最近物体数量 int targetCount = 4; // 存储最近的Collider和对应的距离,方便后续比较替换 List<(Collider collider, float distance)> closestColliders = new List<(Collider, float)>(); foreach (Collider collider in hitColliders) { float distance = Vector3.Distance(collider.transform.position, transform.position); // 列表未填满时直接添加 if (closestColliders.Count < targetCount) { closestColliders.Add((collider, distance)); } else { // 找到列表中距离最远的项 var farthestItem = closestColliders.OrderByDescending(item => item.distance).First(); // 当前物体更近则替换最远项 if (distance < farthestItem.distance) { closestColliders.Remove(farthestItem); closestColliders.Add((collider, distance)); } } } // 转换为Collider数组返回 Collider[] result = closestColliders.Select(item => item.collider).ToArray(); // 使用结果 if (result.Length > 0) { // 处理逻辑 }
方法二:使用LINQ实现(简洁直观)
如果hitColliders数量不大,用LINQ可以写出更简洁的代码,逻辑清晰:
int targetCount = 4; // 配对Collider与距离、按距离排序、取前N个、提取Collider数组 Collider[] result = hitColliders .Select(collider => new { Collider = collider, Distance = Vector3.Distance(collider.transform.position, transform.position) }) .OrderBy(item => item.Distance) .Take(targetCount) .Select(item => item.Collider) .ToArray(); // 使用结果 if (result.Length > 0) { // 处理逻辑 }
注意事项
- 两种方法都支持修改
targetCount调整需要获取的最近物体数量 - 若hitColliders数量小于
targetCount,会返回所有命中的Collider - 手动维护的方法在处理大量Collider时性能更优,避免了全量排序开销
内容的提问来源于stack exchange,提问作者Luke Wenke
相关产品推荐
相关产品推荐

