Unity获取相机渲染范围内的所有物体

1.获取所有相机渲染的物体(包括子物体)。

cs 复制代码
using System.Collections.Generic;
using UnityEngine;

public class RenderedObjects : MonoBehaviour
{
    public Camera camera;

    private void Start()
    {
        if (camera == null)
        {
            camera = Camera.main;
        }
    }

    private void Update()
    {
        Renderer[] renderers = GetRenderedObjects(camera);
        foreach (Renderer renderer in renderers)
        {
            Debug.Log("Rendered object: " + renderer.gameObject.name);
        }
    }

    private Renderer[] GetRenderedObjects(Camera camera)
    {
        Plane[] frustumPlanes = GeometryUtility.CalculateFrustumPlanes(camera);
        Renderer[] allRenderers = FindObjectsOfType<Renderer>();
        List<Renderer> renderedObjects = new List<Renderer>();

        foreach (Renderer renderer in allRenderers)
        {
            if (GeometryUtility.TestPlanesAABB(frustumPlanes, renderer.bounds))
            {
                renderedObjects.Add(renderer);
            }
        }

        return renderedObjects.ToArray();
    }

}

2.获取所有相机渲染的物体(不包括子物体)。

cs 复制代码
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class RenderedObjects : MonoBehaviour
{
    public Camera camera;

    private void Start()
    {
        if (camera == null)
        {
            camera = Camera.main;
        }
    }

    private void Update()
    {
        Transform[] parentObjects = GetParentObjects(camera);
        foreach (Transform parentObject in parentObjects)
        {
            if (parentObject != null) Debug.Log("Parent object: " + parentObject.gameObject.name);
        }
    }

    private Transform[] GetParentObjects(Camera camera)
    {
        Plane[] frustumPlanes = GeometryUtility.CalculateFrustumPlanes(camera);
        Renderer[] allRenderers = FindObjectsOfType<Renderer>();
        HashSet<Transform> parentObjects = new HashSet<Transform>();

        foreach (Renderer renderer in allRenderers)
        {
            if (renderer.transform.childCount == 0 && GeometryUtility.TestPlanesAABB(frustumPlanes, renderer.bounds))
            {
                parentObjects.Add(renderer.transform);
            }
            else if (renderer.transform.childCount > 0)
            {
                Transform parent = renderer.transform.parent;
                while (parent != null)
                {
                    if (!parentObjects.Contains(parent) && GeometryUtility.TestPlanesAABB(frustumPlanes, parent.GetComponent<Renderer>().bounds))
                    {
                        parentObjects.Add(parent);
                    }
                    parent = parent.parent;
                }
            }
        }

        return parentObjects.ToArray();
    }

}
相关推荐
雪儿waii6 小时前
Unity 中的 Resources 详解
unity·游戏引擎
RReality17 小时前
【Unity UGUI】Toggle / ToggleGroup 与 Dropdown
ui·unity·游戏引擎·图形渲染·材质
雪儿waii18 小时前
Unity 中的 InvokeRepeating 详解
unity·游戏引擎
mxwin18 小时前
Unity Shader 程序化生成:Shader 中的数学宇宙
unity·游戏引擎
雪儿waii20 小时前
Unity 中的 Quaternion(四元数)详解
unity·游戏引擎
RReality20 小时前
【Unity UGUI】ScrollRect 与 Scrollbar 深度用法
unity·游戏引擎
人邮异步社区20 小时前
如何自学游戏引擎的开发?
unity·程序员·游戏引擎
郝学胜-神的一滴21 小时前
[简化版 Games 101] 计算机图形学 05:二维变换下
c++·unity·图形渲染·three.js·opengl·unreal
mxwin1 天前
Unity URP 热更新兼容性:Shader 在 IL2CPP 打包下的注意事项
unity·游戏引擎
mxwin2 天前
Unity shader中TransformWorldToShadowCoord原理解析
unity·游戏引擎·shader