我想检测所有由" Wall_ [0-24] "标记的游戏对象,它们都在相机FOV中。我已经尝试过Raycasting,但因为它只有一条光线,所以它不能同时捕获多个对象。 我试过这个:
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!");
}
}
}
我得到的只是一次又一次的墙 - 并不是真的取决于相机的位置。当我的相机遵循一定的路径时,可见的墙壁应该改变。在图像中绿色部分是可见的,红色的不再是(因为相机已经通过了它们)。
那么我怎么能通过这个特定的相机实现所有看到的墙的输出?
感谢您的帮助!
答案 0 :(得分:2)
使用Draco18s&#39; 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;
}
}
答案 1 :(得分:1)
第1步:Calculate the camera's frustum planes。
第2步:Test each wall's collider against them,该页面上的示例脚本确实包含您需要的所有内容。
如果对象位于由平面定义的体积内,则其对相机可见(并且TestPlanesAABB(...)
返回true),否则不是。
如果你想知道某个物体是否可以从“相机”看到(也就是说,不是相机组件,而是一个像安全摄像头一样的物体,但没有进行任何实际渲染),可以计算出这些平面从任意点(Vector3),视图方向(Vector3)和视野(比率,作为浮点)。我没有手头编写的代码,但如果需要可以获取它。
答案 2 :(得分:0)
这里的诀窍是你是否要检测该游戏对象的第一个可见部分,或者是否要从对象的中心“检测”它。
如果要对可见部分执行此操作,将脚本附加到这些对象以检查可见性可能更简单。
如果你可以在中心可见时“检测”它,你可以从相机中进行。
无论哪种方式,我要做的第一件事就是使用GameObject。 FindGameObjectsWithTag。 FindGameObjectsWithTag
然后,检查每个人的Renderer.isVisible。 Renderer is Visible
在检查渲染器之前,您可以通过检查对象是否在摄影机后面进行进一步优化,首先是通过变换,因为这是一个更昂贵的操作。
Is that transform behind me?
如果这些问题无法解决问题,请告诉我们您最终希望实现的目标。
编辑:根据您的新编辑,我要说您需要使用Raycast All,