编辑房间和入口
示例 SceneTree
综合所有内容,这就是一个示例场景树:
我们使用一个 RoomGroup 来表示外部区域。
Room 内部的 MeshInstance 不是
STATIC
就是DYNAMIC
。我们创建了一个 Spatial(我决定称之为“Freeform”自由,你可以随便起名)用来放置需要自动放置到房间里的
STATIC
和DYNAMIC
对象。(Freeform 在roomlist
里,但不在房间之中。)玩家和怪物位于
roomlist
之外的分支上。玩家和怪物网格的入口模式是
ROAMING
,因此可以进入任意房间。相机位于
roomlist
之外。
在 Blender 中创建房间系统(或者其他建模工具)
你可以完全在编辑器中创建房间系统,也可以在建模工具中建立。有一个小问题—Blender等建模工具不了解Room、RoomGroup和Portal节点。为了解决这个问题,我们使用了一系列的命名规则。当Godot首次遇到这些命名特别的节点时,把它们转换成Room、RoomGroups和Portals。
后缀约定
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”的 Portal。kitchen*2-portal
- 同样创建通往“kitchen”的 Portal。kitchen*anything_you_want_here-portal
- 也行。
使用这些命名约定的节点都支持使用通配符。
手动定界
手动边界是一种为房间显式设置凸体的方式,如果它们作为场景树中房间的子项出现,则会使用它们。除了后缀,命称并不重要。它们应该是网格,即 Godot 中的 MeshInstance。注意,它们是在转换的过程中,转换为凸体,所以不一定完美。
小技巧
一旦在转换过程中使用,它们将被转换为 IGNORE
入口模式,不会被显示。你也可以在编辑器中使用Generate Points,将这些点转换为存储在房间中的一组点,并删除原来的``-bound`` 网格实例。
编辑入口点
入口由入口节点的变换和形成角的一组点的组合来定义。
默认入口有 4 个角,检查器中会显示:
您可以在 Gizmo 或检查器中编辑这些点,以在游戏关卡的开场中有更好地匹配。为了提高系统效率,通常,最好尽可能保持少的点。例如,与其花时间在 20 个不同的边上剔除对象,不如尝试更多渲染。
编辑房间点
你也可以选择手动编辑用于定义房间凸体的点。这些点在默认情况下是不存在的。通常选择一个房间,按下编辑器工具栏上的生成点按钮来创建它们。这将把自动绑定的几何体(或手动 -bound
的网格)转移到检查器中。一旦检查器中出现了点,它们就会被使用,并覆盖其他的方式。因此,如果你想恢复手动编辑,请删除所有房间的点。
手动编辑点在某些情况下是有用的,尤其是在自动绑定不能完全获得您想要的正确结果的情况下。在生成点之前,在房间的检查器中使用大量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
请注意,多重网格被当作一组剔除,而不是单独剔除,因此,你应该尽可能地将其保持在同一区域内。