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();
    }

}
相关推荐
lrh30258 分钟前
Custom SRP - 14 Multiple Cameras
unity·渲染管线·srp
Hody9121 小时前
【XR开发系列】Unity下载与安装详细教程(UnityHub、Unity)
unity·游戏引擎·xr
程序员正茂1 天前
在Unity3d中使用Netly开启TCP服务
unity·tcp·netly
Little丶Seven1 天前
使用adb获取安卓模拟器日志
android·unity·adb·个人开发
黄思搏3 天前
Unity坐标转换指南 - 3D与屏幕UI坐标互转
ui·3d·unity
weixin_424294673 天前
在 Unity 游戏开发中,为视频选择 VP8 还是 H.264
unity·游戏引擎
一步一个foot-print3 天前
【Unity】Light Probe 替代点光源给环境动态物体加光照
unity·游戏引擎
@LYZY4 天前
Unity 中隐藏文件规则
unity·游戏引擎·游戏程序·vr
霜绛4 天前
C#知识补充(二)——命名空间、泛型、委托和事件
开发语言·学习·unity·c#
Sator14 天前
使用Unity ASE插件设置数值不会生效的问题
unity·游戏引擎