我试图在将玩家作为原点的范围内检测对象。
如何在不使用碰撞器的情况下从玩家周围的给定区域找到Transforms
或Physics.OverlaptSphere()
我不想使用此方法,因为我需要的唯一信息是来自给定的附近对象的变换LayerMask
(更具体地说,位置和旋转)如果我使用物理学,我必须在每个我认为不必要的点上设置一个触发器。
是否有其他方法可以找到其他与使用物理学相似的点?
答案 0 :(得分:1)
如果您希望在没有Physcics或Colliders的情况下执行此操作,请访问所有对象。循环遍历它们,检查图层以及它们是否匹配,使用Vector3.Distance
比较每个对象的距离。返回结果。
List<GameObject> findNearObjects(GameObject targetObj, LayerMask layerMask, float distanceToSearch)
{
//Get all the Object
GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
List<GameObject> result = new List<GameObject>();
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
检索所有GameObjects
可以改进这一点,但它不会返回标记为DontDestroyOnLoad
的对象。
扩展为扩展功能:
public static class ExtensionMethod
{
public static List<GameObject> findNearObjects(this GameObject targetObj, LayerMask layerMask, float distanceToSearch)
{
GameObject[] sceneObjects = UnityEngine.Object.FindObjectsOfType<GameObject>();
List<GameObject> result = new List<GameObject>();
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<GameObject> sceneObjects = gameObject.findNearObjects(layerMask, 5f);