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

时间:2017-11-18 10:27:59

标签: c# unity3d unity5

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

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

1 个答案:

答案 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);