如何检测相机FOV中的所有游戏对象? Unity3D

我想检测所有标记为“Wall_ [0-24] ”的游戏对象,这些对象都在相机FOV中。 我已经尝试过Raycasting,但因为它只有一条光线,所以它不会同时捕获多个对象。 我尝试过这个:

void Update() { GameObject walls = GameObject.FindGameObjectWithTag ("Wall"); Renderer[] renders = walls.GetComponentsInChildren (); for (int i = 1; i < renders.Length; i++) { if (walls.GetComponentInChildren ().isVisible) { Debug.Log (renders[i] + " is detected!"); } else { Debug.Log ("Nothing's detecetd!"); } } } 

我得到的只是一次又一次 – 不是真的取决于相机的位置。 当我的相机遵循一定的路径时,可见的墙壁应该改变。 在图像中,绿色部分是可见的,红色部分不再可见(因为相机已经通过它们)。 解释什么应该输出为可见墙

那么我怎么能通过这个特定的相机实现所有看到的墙输出

感谢您的任何帮助!

使用Draco18s的答案 ,下面是如何实现他所说的。

创建一个新脚本并将其命名为CheckWalls并附加以下代码

 using System.Collections; using System.Collections.Generic; using UnityEngine; public class CheckWalls : MonoBehaviour { Renderer[] renderers; void Awake () { GameObject walls = GameObject.FindGameObjectWithTag ("Wall"); renderers = walls.GetComponentsInChildren (); } void Update() { OutputVisibleRenderers(renderers); } void OutputVisibleRenderers (Renderer[] renderers) { foreach (var renderer in renderers) { // output only the visible renderers' name if (IsVisible(renderer)) { Debug.Log (renderer.name + " is detected!"); } } Debug.Log ("--------------------------------------------------"); } private bool IsVisible(Renderer renderer) { Plane[] planes = GeometryUtility.CalculateFrustumPlanes(Camera.main); if (GeometryUtility.TestPlanesAABB(planes , renderer.bounds)) return true; else return false; } } 

第1步: 计算相机的平截头体平面 。

第2步: 测试每个墙的对撞机 ,该页面上的示例脚本几乎包含您需要的所有内容。

如果对象位于由平面定义的体积内,则其对相机可见(并且TestPlanesAABB(...)返回true),否则不是。

如果你想知道一个物体是否可以从“相机”看到(也就是说,不是相机组件,而是一个像安全摄像头一样的物体,但是没有进行任何实际渲染),那么这些飞机可以从一个任意的点(Vector3),视图方向(Vector3)和视野(比率,作为浮点数)。 我没有我手头编写的代码,但如果需要可以获取它。

这里的技巧是你是想要检测该游戏对象的第一个可见部分 ,还是想要从对象的中心“检测”它。

如果要对可见部分执行此操作,则可以更简单地将脚本附加到这些对象以检查可见性。

如果你可以“检测”它,一旦中心可见,你可以从相机进行。

无论哪种方式,我要做的第一件事就是使用GameObject。 FindGameObjectsWithTag。 FindGameObjectsWithTag

然后,检查每个人的Renderer.isVisible。 渲染器是可见的

您可以通过在检查渲染器之前检查对象是否在摄像机后面,首先通过其变换来进一步优化这一点,因为这是一个更昂贵的操作。
这种变化背后的变化吗?

如果这些问题无法解决您的问题,请告诉我们您最终希望实现的目标。

编辑:根据您的新编辑,我会说您需要使用Raycast All,

RaycastAll