如何检测相机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
- 使用Action 创建任务
- 无法在“MiniListView”类型的“Headers”属性上设置“绑定”。 ‘绑定’只能在DependencyObject的DependencyProperty上设置
- 如何处理BackgroundWorker线程中的exception?
- WPF MVVM命令canexecute启用/禁用按钮
- 在SSIS中的Script Task中连接到SQL数据库
- 如何使用箭头在文本框之间移动光标?
- 使用JSON.NetvalidationJsonConvert.DeserializeObject的结果(想想“尝试解析”)
- MVC请求的Ninject Contextual绑定
- Azure WebRole CloudConfigurationManager.GetSetting返回null