我想检测所有标记为“ Wall_ [0-24]”的游戏对象,它们位于摄像机FOV内。我已经尝试过光线投射,但是由于它只有一条光线,因此无法同时捕获多个对象。
我尝试了这个:

void Update() {
    GameObject walls = GameObject.FindGameObjectWithTag ("Wall");
    Renderer[] renders = walls.GetComponentsInChildren<Renderer> ();

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


我得到的只是一遍又一遍的墙-并不真正取决于相机的位置。当我的相机沿着某个路径行驶时,可见的墙壁应会改变。在图像中,绿色部分可见,而红色部分不再可见(因为相机已经通过了它们)。 c# - 如何检测相机FOV中的所有GameObject? Unity3D-LMLPHP

那么,如何通过此特定摄像机实现所有可见墙的输出?

感谢您的任何帮助!

最佳答案

下面使用Draco18s的answer来实现他所说的内容。

创建一个新脚本并将其命名为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<Renderer> ();
    }

    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;
    }
}

10-07 19:29
查看更多