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

news/2024/7/24 5:00:32 标签: unity

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

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.获取所有相机渲染的物体(不包括子物体)。 

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

}


http://www.niftyadmin.cn/n/5304798.html

相关文章

关于TCP vegas算法杂谈

看到大佬写的优秀的 tcp vegas 拥塞控制大揭秘-CSDN博客&#xff0c;有感而发&#xff0c;自己研究CC有一段时间了。但是还一直有vegas多牛的说法。从理论上来说&#xff0c;vegas确实是比较好的CC算法&#xff0c;特别是他的公平友好性&#xff0c;我个人也觉得是最好的。 包…

VUE的template使用

在 Vue 中&#xff0c;如果你想在其他地方使用一个组件的模板&#xff0c;不需要为该模板定义特定的 ID。你只需要确保你在其他地方正确引入了该组件&#xff0c;并在需要的位置使用它即可。 假设你在一个单文件组件中定义了一个名为 HelloWorld 的组件&#xff0c;其模板如下…

Jvm垃圾收集器系列之G1的小知识(个人见解仅供参考)

问&#xff1a;G1收集器有哪些主要特点&#xff1f; 答&#xff1a;G1收集器的主要特点包括&#xff1a;面向服务器、高吞吐量、满足GC停顿时间要求、将Java堆划分为多个大小相等的独立区域&#xff08;Region&#xff09;、保留了年轻代和老年代的概念但不再是物理隔阂、对大对…

git 常用命令 修改 远程仓库 默认分支

git remote set-head origin -a 将 origin/HEAD 指向 远程仓库的 默认分支&#xff08;-a 即 --auto&#xff09; git remote set-head origin dev 将 origin/HEAD 指向 &#xff08;origin/dev&#xff09; git remote set-head origin -d 删除 origin/…

16.Linux Bash Shell通过`read`命令读取用户输入

文章目录 Linux Shell获取用户输入处理简单输入控制等待隐藏输入从文件中读取 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; Linux Shell获取用户输入 处理简单输入 shell与用户交互式输入使用的是read命令&#xff0c;一个简单的例子…

【赠书第16期】码上行动:用ChatGPT学会Python编程

文章目录 前言 1 ChatGPT简介 2 Python编程简介 3 使用ChatGPT学习Python编程 4 如何使用ChatGPT学习Python编程 5 推荐图书 6 粉丝福利 前言 随着人工智能技术的不断发展&#xff0c;聊天机器人已经成为我们日常生活和工作中不可或缺的一部分。其中&#xff0c;ChatGP…

【Storm实战】1.1 图解Storm的抽象概念

文章目录 0. 前言1. Storm 中的抽象概念1.1 流 (Stream)1.2 拓扑 (Topology)1.3 Spout1.4 Bolt1.5 任务 (Task)1.6 工作者 (Worker) 2. 形象的理解Storm的抽象概念2.1 流 (Stream)2.2 拓扑 (Topology)2.3 Spout2.4 Bolt2.5 任务 (Task)2.6 工作者 (Worker)场景1场景2 3.参考文档…

C语言和C++中的左值、右值、纯右值、将死值【超详细讲解/一文搞明白系列】

引言 在C和C中&#xff0c;值和变量的概念是基础&#xff0c;但在深入学习时会遇到一些特殊的术语&#xff0c;如左值、右值、纯右值和将死值。这些术语在讨论表达式、赋值、函数参数传递等方面有着重要的作用。本文将详细解释这些概念&#xff0c;并给出代码示例。 左值、右…