编辑房间和入口

示例 SceneTree

综合所有内容,这就是一个示例场景树:

../../../_images/example_scenetree.png

  • 我们使用一个 RoomGroup 来表示外部区域。

  • Room 内部的 MeshInstance 不是 STATIC 就是 DYNAMIC

  • 我们创建了一个 Spatial(我决定称之为“Freeform”自由,你可以随便起名)用来放置需要自动放置到房间里的 STATICDYNAMIC 对象。(Freeform 在 roomlist 里,但不在房间之中。)

  • 玩家和怪物位于 roomlist 之外的分支上。

  • 玩家和怪物网格的入口模式是 ROAMING,因此可以进入任意房间。

  • 相机位于 roomlist 之外。

在 Blender 中创建房间系统(或者其他建模工具)

你可以完全在编辑器中创建房间系统,也可以在建模工具中建立。有一个小问题—Blender等建模工具不了解Room、RoomGroup和Portal节点。为了解决这个问题,我们使用了一系列的命名规则。当Godot首次遇到这些命名特别的节点时,把它们转换成Room、RoomGroups和Portals。

后缀约定

  • -room 变成 Room

  • -roomgroup 变成 RoomGroup

  • -portal 变成 Portal

  • -bound 变成手动边界。

Room 和 RoomGroup 在 Blender 中应该被创建为空物体。这样在 Godot 中进行转换时,-room 空物体的子网格就会被自动放进该房间。

例如:

  • kitchen-room - 创建名为“kitchen”的 Room。

  • outside-roomgroup - 创建名为“outside”的 RoomGroup。

  • kitchen-portal - 创建通向“kitchen”房间的 Portal。

入口

入口与房间不同。对于入口,除了名称之外,我们还需要在建模工具中指定入口的几何形状。对于这点,你的“待建入口”应该被创建为网格。

为了正常工作,对入口的网格有一些限制。它们必须是凸的,并且多边形的点应该位于同一平面。平面不必非常精确,因为 Godot 会自动对入口平面的方向求均值。 Portal 节点一旦转换完成,就会强制吸附到入口平面,顶点会以 2D 坐标而不是 3D 点的形式给出(编辑时亦然)。

入口的命名相当重要。你可以把入口命名为 -portal 让 Godot 尝试自动链接入口,也可以把想要链接的房间名作为入口的前缀。

通配符

大多数情况下,用类似 kitchen-portal 这样的名字就可以了。然而还有一个问题。Blender 和 Godot 并不善于处理多个对象名称相同的情况,那么我们想让厨房(kitchen)的入口不止一个该怎么办呢?

变通的方法是使用通配符 *。Godot 读到名称中的通配符时,就会忽略后续的内容。

也就是说,我们可以使用如下的门的名称:

  • kitchen*1-portal - 创建通往 “kitchen” 的门。

  • kitchen*2-portal - 同样创建通往 “kitchen” 的门。

  • kitchen*anything_you_want_here-portal - 也行。

使用这些命名约定的节点都支持使用通配符。

手动定界

手动边界是一种为房间显式设置凸体的方式,如果它们作为场景树中房间的子项出现,则会使用它们。除了后缀,命称并不重要。它们应该是网格,即 Godot 中的 MeshInstance。注意,它们是在转换的过程中,转换为凸体,所以不一定完美。

小技巧

一旦在转换过程中使用,它们将被转换为 IGNORE 入口模式,不会被显示。你也可以在编辑器中使用Generate Points,将这些点转换为存储在房间中的一组点,并删除原来的``-bound`` 网格实例。

编辑入口点

入口由入口节点的变换和形成角的一组点的组合来定义。

默认入口有 4 个角,检查器中会显示:

../../../_images/portal_point_editing.png

您可以在 Gizmo 或检查器中编辑这些点,以在游戏关卡的开场中有更好地匹配。为了提高系统效率,通常,最好尽可能保持少的点。例如,与其花时间在 20 个不同的边上剔除对象,不如尝试更多渲染。

编辑房间点

你也可以选择手动编辑用于定义房间凸体的点。这些点在默认情况下是不存在的。通常选择一个房间,按下编辑器工具栏上的生成点按钮来创建它们。这将把自动或手动绑定的几何体转移到检查器中。一旦检查器中出现了点,它们就会被使用,并覆盖其他的方式。因此,如果你想恢复手动编辑,请删除所有房间的点。

../../../_images/room_point_editing.png

手动编辑点在某些情况下是有用的,尤其是在自动绑定不能完全获得您想要的正确结果的情况下。在生成点之前,在房间的检查器中使用大量Simplification通常是个好主意。注,默认情况下,Simplification值将从RoomManager继承。

RoomManager

显示调试(Show Debug)

可以用来控制日志的量,尤其是房间转换日志。导出后的项目始终是 false

调试蔓延(Debug Sprawl)

此模式将仅显示从当前相机房间穿过入口扩展的网格。通常想要扩展大型静态体跨入口。典型示例可能是地形网格区域,或大型地板或天花板网格。通常不希望门框之类的东西扩展到相邻的房间,这就是微调 Portal Margin 的目的。

合并网格(Merge Meshes)

为了让绘制调用保持最低,系统提供该选项,自动合并房间中相似的 STATIC 网格(也被称作静态批处理)。很多情况下都能提升性能。虽然降低了剔除的精度,但是因为房间通常是剔除的逻辑单元,这样的折衷方案通常能帮到你。

平面简化(Plane Simplification)

部分情况下,根据房间自动生成的凸包轮廓可能包含大量平面,尤其是在使用了曲面的时候。这种情况并不理想,因为会拖慢系统。本选项可以把外包轮廓简化。用户可以在 0(不简化)和 1(最简)之间选择简化的程度。也可以在单独的房间上覆盖这个值。

入口

入口激活(Portal Active)

入口可以在运行时打开和关闭。如果你有可以打开和关闭的房门,就很有用。

双向(Two Way)

入口可以是双向的也可以是单向的。在大多数情况下,默认的双向入口设置起来比较快,但单向入口在某些情况下也很有用。例如,你可以使用单向入口来创建可以看到外面,但看不到里面的窗口。这可以改善从室外查看建筑物的性能。

粒子系统

请注意,在放置 STATIC 粒子系统时,转换时的AABB尺寸可能是零。因此,粒子系统可能会被意外地提前剔除。为了防止这种情况,可以将粒子系统的 portal mode 入口模式设置为 DYNAMIC ,或者在 几何检查器中为粒子系统添加额外的剔除边界Extra Cull Margin

MultiMesh

请注意,多重网格被当作一组剔除,而不是单独剔除,因此,你应该尽可能地将其保持在同一区域内。