[英]How can I detect nearby GameObjects without physics/raycast?
我試圖在以玩家為原點的范圍內檢測物體。 如何在不使用碰撞器或Physics.OverlaptSphere()
情況下從玩家周圍的給定區域找到Transforms
我不想使用此方法,因為我需要的唯一信息是來自給定LayerMask
的附近對象的變換(更具體地說,位置和旋轉)如果我要使用物理,我必須在我認為不必要的每個點上放置一個觸發器。
是否有其他方法可以找到附近的點,但類似於使用物理的方法?
如果您想在沒有 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.