gpt4 book ai didi

c# - 如何检测相机 FOV 内的所有游戏对象? Unity3D

转载 作者:行者123 更新时间:2023-11-30 21:39:49 28 4
gpt4 key购买 nike

我想检测所有由“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!");
}
}
}

我得到的只是每一面墙一次又一次 - 并不真正取决于相机的位置。当我的相机沿着特定路径移动时,可见的墙壁应该会发生变化。在图像中,绿色部分可见,红色部分不再(因为相机已经通过它们)。 explaining what should be output as a visible wall

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

感谢您的帮助!

最佳答案

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

关于c# - 如何检测相机 FOV 内的所有游戏对象? Unity3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45020915/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com