簡體   English   中英

如何在沒有物理/光線投射的情況下檢測附近的游戲對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM