房间和入口示例
下载此简单入口实例教程项目: Simple Portals Example 。
前言
本教程将向你介绍如何建立有两个房间的 “Hello World” 房间系统,以及中间的入口。
第一步
创建新项目。
添加一个 Spatial 作为场景根节点(截图里称作“Root”)。
然后添加一个 RoomManager 节点。我们后面处理房间系统时会用到。
然后我们就要开始定义我们的房间了。我们在另一个叫做“RoomList”(房间列表)的 Spatial 节点下创建房间。
新建一个 Room 节点作为房间列表的子节点。
我们把这个房间命名为
Kitchen
(厨房)。我们现在来创建这个房间的几何体。几何体的名字你可以随便起。
创建一个 MeshInstance 作为地板。先给 MeshInstance 添加一个 CubeMesh 资源形成盒子,然后缩放平移成地板的样子。
为墙壁添加几个 MeshInstance。创建的应该也是盒子网格,然后缩放平移即可。记得留一个开口,开口那一面墙需要分两段。
第二步
现在我们需要创建另一个房间。
可以直接复制第一个房间(选择
Kitchen
节点,右键,然后选择制作副本)。通过旋转平移第二个房间,把两个房间的开口对齐。
把第二个房间重命名为
Lounge
(起居室)。
第三步
接下来,我们要在两个房间之间添加一个入口。
在厨房中新建一个 Portal。
使用检查器中的节点的
Transform
来调整入口的缩放和坐标,使其适合两个房间之间的开口。入口的平面应该朝向源房间的 外侧 ,也就是朝向休息室。这个方向由编辑器中的箭头和入口的颜色表示。
第四步
为了更有趣,我们在房间里多加几个盒子。
将这些盒子作为房间节点的子节点或孙节点,明确告知系统这些对象应该在哪个房间。然而,我们也可以在房间之外创建这些对象。只要它们在房间列表分支当中,系统就会尝试在运行时自动将它们放在正确的房间中。
在截图中,这些盒子是作为名为
Freeform
空间的子项,以保持整洁。给盒子分配绿色的 SpatialMaterial,以使其在房间中突显。
我们再创建一个 OmniLight,它将被自动放置在其中一个房间中。
第五步
接下来是关键阶段。我们必须让RoomManager房间管理器知道房间在哪里!
选择RoomManager,查看检查器窗口的Paths部分。
你需要将Room List指向我们之前创建的RoomList节点,RoomList是所有房间的父节点。
第六步
确保在进行下一步之前,你已经保存了项目。在转换之前,最好总是保存并做备份。
选择RoomManager,你会在3D编辑器视窗顶部的工具栏中看到一个按钮,叫做Convert Rooms,按下这个按钮。
如果一切顺利,RoomManager将创建运行时数据( 房间图),以便在运行时进行遮挡剔除。
您可以在输出窗口中看到转换过程的日志。这有助于发现问题。
如果你现在在房间内移动编辑器相机,应该可以看到对面房间的网格被剔除,是取决于你通过入口所能看到的东西。
总结
这个简单的教程到此结束。你可以尝试创建的新房间系统。
试一试
创建不同类型的几何体。入口系统支持 CSG 节点、粒子系统和多重网格。
尝试创建相机并将其添加到场景中。如果运行场景,您会注意到入口剔除未处于活动状态。这是因为每次加载关卡时都必须通过转换房间来创建房间数据
room graph
。在实际游戏中,您无需在编辑器中使用按钮,而是通过 RoomManager 调用函数来转换关卡,rooms_convert()
。使用脚本试用此内容,也许是在_ready()
函数中运行。到目前为止,你创建的几何体都是
STATIC
(非移动的)。如果在检查器中查看几何体节点,你会看到它们源自CullInstance
。你可以为入口系统中的对象设置入口模式,其决定了节点的处理方式。如果你现在写一个脚本,在房间里移动一个对象,并在场景运行时,通过相机查看,你可能会注意到这个对象被错误地剔除了。这是因为
STATIC
对象被认为不会在系统中移动。如果你把这个对象改为DYNAMIC
后,应该能正确地更新剔除。有几种
portal_modes
,在主文档中有描述。试着在运行时,从脚本中调用
set_portal_active()
来打开和关闭入口。如果你选择了入口,应该可能看到出现4个手柄。试着用鼠标拖动入口的点,看看它对被剔除的对象有什么影响。
如果你选择一个房间并点击工具栏上的Generate Points按钮,它将把房间外体的点储存在房间的检查器中。你现在可以用辅助工具手柄来编辑这些点。