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

}
相关推荐
新的瑞拉公主2 天前
Unity游戏发布微信小游戏:从构建到提审
unity·webgl·微信小游戏·开放数据域
心前阳光3 天前
Unity发布PC软件图标不能改变
unity·游戏引擎
an86950013 天前
unity如何在visual studio中打断点debug
unity·游戏引擎·visual studio
xcLeigh3 天前
Unity基础:使用Transform控制物体移动——Translate与position详解
unity·游戏引擎
FairGuard手游加固4 天前
Unity小游戏加密:global-metadata.dat与AssetBundle保护
游戏·unity·游戏引擎
真鬼1234 天前
【Unity AI】Untiy链接cursor与MCP
unity·游戏引擎
WarPigs4 天前
Unity设置人物位置无效的原因
unity
程序员正茂4 天前
Unity3d行为树Behavior Designer Pro
unity·行为树
玖玥拾4 天前
Lua 基础语法(八) Unity Huatuo (HybridCLR)
开发语言·unity·游戏引擎·lua
平行云4 天前
国产GPU云渲染适配实战:驱动兼容、编码调优与多路并发
unity·ue5·webrtc·webgl·实时云渲染·云桌面·像素流送