版本:Unity 6 (6000.0)
语言:English
使用 CullingGroup API 配置剔除
创建剔除组

CullingGroup API 简介

CullingGroup 提供了一种方法,可以将您自己的系统集成到 Unity 的剔除和LOD细节层次 (LOD) 技术是一种优化方法,当游戏对象与摄像机的距离增加时,它会减少 Unity 需要渲染的游戏对象三角形数量。 更多信息
参见 术语表
管道中。这可以用于多种目的;例如

  • 模拟人群,同时仅为当前实际可见的角色提供完整的游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等。游戏对象的函数由附加在其上的组件定义。 更多信息
    参见 术语表
  • 构建由 Graphics.DrawProcedural 驱动的 GPU粒子系统一个组件,通过在场景中生成和动画化大量的小型 2D 图像来模拟流体实体,例如液体、云和火焰。 更多信息
    参见 术语表
    ,但跳过渲染位于墙壁后面的粒子系统
  • 跟踪哪些生成点隐藏在摄像机一个组件,在场景中创建特定视点的图像。输出要么绘制到屏幕上,要么作为纹理捕获。 更多信息
    参见 术语表
    后面,以便在玩家看不到它们“突然出现”的情况下生成敌人
  • 切换角色,在靠近时使用全质量动画和 AI 计算,在远处使用低质量更便宜的行为
  • 在您的场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置环境、障碍物和装饰,从本质上讲,您是分段设计和构建游戏。 更多信息
    参见 术语表
    中拥有 10,000 个标记点,并有效地找出玩家何时靠近其中任何一个 1 米以内

该 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 配置剔除
创建剔除组