如何在没有物理/光线投射的情况下检测附近的GameObjects?

我试图在玩家作为原点的范围内检测对象。 如何在不使用碰撞器或Physics.OverlaptSphere()情况下从玩家周围的给定区域找到Transforms我不想使用此方法,因为我需要的唯一信息是从给定的LayerMask转换附近的对象(更具体地说,位置和旋转)如果我使用物理学,我将不得不在我认为不必要的每个点上设置一个触发器。

是否有其他方法可以找到附近的其他点,但与使用物理的点相似?

如果您希望在没有Physcics或Colliders的情况下执行此操作,请访问所有对象。 循环遍历它们,检查图层以及它们是否匹配,使用Vector3.Distance来比较每个对象的距离。 返回结果。

 List findNearObjects(GameObject targetObj, LayerMask layerMask, float distanceToSearch) { //Get all the Object GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType(); List result = new List(); for (int i = 0; i < sceneObjects.Length; i++) { //Check if it is this Layer if (sceneObjects[i].layer == layerMask.value) { //Check distance if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch) { result.Add(sceneObjects[i]); } } } return result; } 

这可以通过使用Scene.GetRootGameObjects来检索所有Scene.GetRootGameObjects来改进,但它不会返回标记为DontDestroyOnLoad对象。

扩展为扩展function:

 public static class ExtensionMethod { public static List findNearObjects(this GameObject targetObj, LayerMask layerMask, float distanceToSearch) { GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType(); List result = new List(); for (int i = 0; i < sceneObjects.Length; i++) if (sceneObjects[i].layer == layerMask.value) if (Vector3.Distance(sceneObjects[i].transform.position, targetObj.transform.position) < distanceToSearch) result.Add(sceneObjects[i]); return result; } } 

用法:

 List sceneObjects = gameObject.findNearObjects(layerMask, 5f);