我想检测所有标记为“ 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!");
}
}
}
我得到的只是一遍又一遍的墙-并不真正取决于相机的位置。当我的相机沿着某个路径行驶时,可见的墙壁应会改变。在图像中,绿色部分可见,而红色部分不再可见(因为相机已经通过了它们)。
那么,如何通过此特定摄像机实现所有可见墙的输出?
感谢您的任何帮助!
最佳答案
下面使用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;
}
}