Version: Unity 6.0 (6000.0)
语言 : 中文
使用 CullingGroup API 配置剔除
创建剔除组 (Culling Group)

CullingGroup API 简介

CullingGroup 提供一种将系统集成到 Unity 剔除和__ LOD__见__细节级别__。
See in Glossary
管线中的方法。这可用于许多目的;例如:

  • 模拟一群人,同时只为现在实际可见的角色提供完整的游戏对象
  • 构建由 Graphics.DrawProcedural 驱动的 GPU 粒子系统,但是跳过对墙背后的粒子系统的渲染
  • 跟踪不在摄像机视野范围内的生成点,以便在生成敌人时不让玩家看到他们“弹入”视图
  • 将角色从近处的全质量动画和 AI 计算切换到远处更低质量、更低成本的行为
  • 在场景中设置 10,000 个标记点,并在玩家进入其中任何标记点的 1m 范围内时有效发现这一状态

API 的工作原理是让您提供一系列包围球体。然后,会计算这些球体相对于特定摄像机的可见性,同时还会计算出一个 “距离范围” 值,这个值可以当作是一个细节层次(LOD)等级数值来处理。

CullingGroup API 最佳实践

在考虑如何将 CullingGroup 应用于项目时,请考虑 CullingGroup 设计的以下方面。

利用可见性

CullingGroup 为其计算可见性的所有体积都由包围球体定义;实际上,由位置(球体中心)和半径值定义。出于性能原因,不支持其他包围形状。在实践中,这意味着您将定义一个球体来完全包围希望剔除的对象。如果需要更紧密拟合,请考虑使用多个球体来覆盖对象的不同部分,并根据所有球体的可见性状态做出决定。

为了评估可见性,CullingGroup 需要知道应该从哪个摄像机可见性开始计算。目前,单个 CullingGroup 仅支持单个摄像机。如果需要评估多个摄像机的可见性,应为每个摄像机使用一个 CullingGroup 并合并结果。

CullingGroup 将仅基于视锥体剔除和静态遮挡剔除来计算可见性。它不会将动态对象视为潜在遮挡物。

利用距离

CullingGroup 能够计算某个参考点(例如,摄像机或玩家的位置)与每个球体上最近点之间的距离。此距离值不会直接提供给您,而是使用您提供的一组阈值来量化,以便计算离散的“距离带”整数结果。目的是将这些距离带解读为“近距离”、“中距离”、“远距离”等。

一个对象从一个区域移到另一个区域时,CullingGroup 将提供回调,让您有机会进行某些操作,例如将该对象的行为更改为 CPU 使用强度较低的操作。

超出最后一个距离的任何球体都将被视为不可见,这使您可以轻松构建一个剔除实现来完全停用非常远的对象。如果不想要此行为,只需将最终阈值设置为无限远的距离。

每个 CullingGroup 仅支持一个参考点。

性能和设计

CullingGroup API 不允许您对场景进行更改后立即请求包围球体的新可见性状态。出于性能原因,CullingGroup 仅在执行整个摄像机剔除期间计算新的可见性信息;此时,您可以通过回调或 CullingGroup 查询 API 来获取信息。实际上,这意味着您应该以异步方式处理 CullingGroup。

提供给 CullingGroup 的包围球体数组将由 CullingGroup 引用,而不是复制。这意味着您应该保留对传递给 SetBoundingSpheres 的数组的引用,并可修改此数组的内容,而无需再次调用 SetBoundingSpheres。如果需要多个 CullingGroup 来计算同一组球体的可见性和距离(例如,对于多个摄像机),那么让所有 CullingGroup 共享相同的包围球体数组实例会很高效。

使用 CullingGroup API 配置剔除
创建剔除组 (Culling Group)