我如何在没有 physics/raycast 的情况下检测附近的游戏对象?

How can I detect nearby GameObjects without physics/raycast?

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

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

如果您想在没有物理或碰撞器的情况下执行此操作,请访问所有对象。遍历它们,检查图层,如果它们匹配,则使用 Vector3.Distance 比较每个对象的距离。 Return 结果。

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 但它不会 return 标记为 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);