如何在没有物理/光线投射的情况下检测附近的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);