遮挡器节点

除了通过 房间和入口 实现遮挡外,Godot 还提供了使用简单几何 Occluder(遮挡器)节点进行简单遮挡的能力。这些几何体形状会在编辑器中以控制器的形式显示,在运行时不可见。

完全被该形状遮挡(位于背部或内部)的对象在运行时会被剔除。它们是以简单易用、不带来运行时负担为目的而设计的,但也因此可能没有 房间和入口 高效。然而,在某些情况下仍然会带来显著的性能提升。

备注

需要重点注意的是,几何体遮挡器的工作原理是检查遮挡器和被遮挡物体的轴对齐包围盒(AABB)。AABB 被完全遮挡才会进行剔除。因此,剔除较小的对象比剔除较大的对象更高效。

Occluder 节点的主要优势在于它们是完全动态的。例如你为宇宙飞船添加了遮挡器子节点,那么这个遮挡器就会跟随父对象移动。

Occluder 节点之所以对性能影响那么小,是因为引擎在运行时会根据当前 Camera 的视角动态选择最相关的遮挡器。也就是说, 你可以在一个场景里拥有上百个遮挡器,在同一时间,只有那个最相关的会被激活。

Occluder 节点自身就是 OccluderShape 资源的持有者,功能顾名思义。首先,在你的场景树中添加一个 Occluder 节点。

小技巧

你会看到一个黄色的警告三角形,表示在 Occluder 可以生效之前,你必须在检查器中为其设置一个 OccluderShape。

OccluderShapeSphere

球体是最简单快速的遮挡器之一,设置和摆放都很方便。缺点是球体往往只在特定的游戏关卡设计中有意义,更适用于地形和有机背景几何体。

添加 OccluderNode 并在检查器中新建 OccluderShapeSphere 后,点击检查器中的 OccluderShapeSphere 调出它的参数。

../../_images/occluder_shape_sphere_inspector.png

与很多 Node 节点不同,OccluderShapeSphere 可以在一个对象中存储多个球体。在引擎中更高效,也能让你的 SceneTree 场景树更清爽。你不必把所有的球体都保存在同一个 Occluder 里,管理起来会很麻烦,加 10 个左右的球体是比较合理的。这些球体非常轻量,而且通常加得越多越能与几何体相匹配。

为了保存多个球体,它们会被存入 Array 数组。你可以在检查器中点击 Array,然后把 Array 的大小增大,来添加一个球体。

../../_images/occluder_shape_sphere_terrain.png

编辑器窗口中,这个球体会显示为一个小小的粉色圆形物体。每个球体有两个句柄。中间较大的的句柄可以用来在 Occluder 的局部空间中移动球体,较小的句柄可以用来调整半径。

虽然你也可以通过在检查器中修改 Occluder 节点的变换属性来改变这个球体的位置,但是这样就会移动数组中的所有球体。如果你想在一个遮挡器中使用多个球体,请使用那些句柄来调整位置。因为要支持 3D 空间中的定位,控制器会根据编辑器的视点,只允许移动 3D 位置中的两个主轴。百闻不如一试。

小技巧

使用多个球体时,编辑器还提供了一个便捷的功能。如果你单击工具栏上的居中节点按钮,就会重新计算这些球体相对于整个节点的局部位置,然后修改 Occluder 节点的变换。这个功能可以让排布小球变得更方便。

在运行时,你可以通过修改 Occluder 节点的可见性来开关这些球体,这个节点也能进行移动、缩放、旋转等操作。

球体遮挡器的常见使用场景是为山体/丘陵地形提供遮挡。把球体放在山体内部,你就可以防止渲染山背面的树木、植物、建筑、对象等内容。如果发挥想象力,还可以把它们用于大型飞行器、星球等移动对象。