簡體   English   中英

如何檢測相機FOV中的所有GameObject? Unity3D

[英]How to detect all GameObjects within the Camera FOV? Unity3D

我想檢測所有標記為“ 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的答案來實現他所說的。

創建一個新腳本並將其命名為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: 計算相機的視錐平面

第2步: 測試每個牆的碰撞器是否與之碰撞 ,該頁面上的示例腳本實際上包含了您所需的一切。

如果對象在平面定義的體積之內,則它在相機中可見(並且TestPlanesAABB(...)返回true),否則不是。

如果您想知道某個對象是否可以從“攝像機”中看到(即,不是攝像機組件,而是一個類似於安全攝像機但未進行任何實際渲染的對象),則可以從任意點(Vector3),視圖方向(Vector3)和視場(比率,浮點數)。 我沒有手頭編寫的代碼,但是可以根據需要獲取。

這里的竅門是您是要檢測該游戲對象的第一個可見部分 ,還是要從該對象的中心“檢測”它。

如果要對可見部分執行此操作,將腳本附加到這些對象以檢查可見性可能會更簡單。

如果您可以在中心可見后進行“檢測”,則可以從相機中進行。

無論哪種方式,我要做的第一件事就是使用GameObject。 FindGameObjectsWithTag。 FindGameObjectsWithTag

然后,檢查Renderer.isVisible每個。 渲染器可見

您可以通過在檢查渲染器之前先檢查對象是否在相機后面來進一步優化該對象,因為這是一項更昂貴的操作。
那是在我身后嗎?

如果這些方法不能解決您的問題,請告訴我們更多您最終希望實現的目標。

編輯:根據您的新編輯,我想您需要使用Raycast All,

RaycastAll

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM