房间和入口示例

Download this tutorial project: Simple Portals Example .

前言

本教程将向你介绍如何建立有两个房间的 "Hello World" 房间系统,以及中间的入口。

第一步

../../../_images/tutorial_simple_1.png
  • 创建新项目。

  • 添加一个 Spatial 作为场景根节点(截图里称作“Root”)。

  • 然后添加一个 RoomManager 节点。我们后面处理房间系统时会用到。

  • 然后我们就要开始定义我们的房间了。我们在另一个叫做“RoomList”(房间列表)的 Spatial 节点下创建房间。

  • 新建一个 Room 节点作为房间列表的子节点。

  • 我们把这个房间命名为 Kitchen(厨房)。

  • 我们现在来创建这个房间的几何体。几何体的名字你可以随便起。

  • 创建一个 MeshInstance 作为地板。先给 MeshInstance 添加一个 CubeMesh 资源形成盒子,然后缩放平移成地板的样子。

  • 为墙壁添加几个 MeshInstance。创建的应该也是盒子网格,然后缩放平移即可。记得留一个开口,开口那一面墙需要分两段。

第二步

../../../_images/tutorial_simple_2.png
  • 现在我们需要创建另一个房间。

  • 可以直接复制第一个房间(选择 Kitchen 节点,右键,然后选择制作副本)。

  • 通过旋转平移第二个房间,把两个房间的开口对齐。

  • 把第二个房间重命名为 Lounge(起居室)。

第三步

../../../_images/tutorial_simple_3.png
  • 接下来,我们要在两个房间之间添加一个入口。

  • 在厨房中新建一个 Portal

  • 使用检查器中的节点的 Transform 来调整入口的缩放和坐标,使其适合两个房间之间的开口。

  • 入口的平面应该朝向源房间的 外侧 ,也就是朝向休息室。这个方向由编辑器中的箭头和入口的颜色表示。

第四步

../../../_images/tutorial_simple_4.png
  • 为了更有趣,我们在房间里多加几个盒子。

  • 将这些盒子作为房间节点的子节点或孙节点,明确告知系统这些对象应该在哪个房间。然而,我们也可以在房间之外创建这些对象。只要它们在房间列表分支当中,系统就会尝试在运行时自动将它们放在正确的房间中。

  • 在截图中,这些盒子是作为名为 Freeform 空间的子项,以保持整洁。

  • 给盒子分配绿色的 SpatialMaterial,以使其在房间中突显。

  • 我们再创建一个 OmniLight,它将被自动放置在其中一个房间中。

第五步

../../../_images/tutorial_simple_5.png
  • 接下来是关键阶段。我们必须让RoomManager房间管理器知道房间在哪里!

  • 选择RoomManager,查看检查器窗口的Paths部分。

  • 你需要将Room List指向我们之前创建的RoomList节点,RoomList是所有房间的父节点。

第六步

../../../_images/tutorial_simple_6.png
  • 确保在进行下一步之前,你已经保存了项目。在转换之前,最好总是保存并做备份。

  • 选择RoomManager,你会在3D编辑器视窗顶部的工具栏中看到一个按钮,叫做Convert Rooms,按下这个按钮。

  • 如果一切顺利,RoomManager将创建运行时数据( 房间图),以便在运行时进行遮挡剔除。

  • 您可以在输出窗口中看到转换过程的日志。这有助于发现问题。

  • 如果你现在在房间内移动编辑器相机,应该可以看到对面房间的网格被剔除,是取决于你通过入口所能看到的东西。

总结

这个简单的教程到此结束。你可以尝试创建的新房间系统。

试一试

  • 创建不同类型的几何体。入口系统支持 CSG 节点、粒子系统和多重网格。

  • 尝试创建相机并将其添加到场景中。如果运行场景,您会注意到入口剔除未处于活动状态。这是因为每次加载关卡时都必须通过转换房间来创建房间数据 room graph。在实际游戏中,您无需在编辑器中使用按钮,而是通过 RoomManager 调用函数来转换关卡, rooms_convert()。使用脚本试用此内容,也许是在 _ready() 函数中运行。

  • 到目前为止,你创建的几何体都是 STATIC(非移动的)。如果在检查器中查看几何体节点,你会看到它们源自 CullInstance。你可以为入口系统中的对象设置入口模式,其决定了节点的处理方式。

  • 如果你现在写一个脚本,在房间里移动一个对象,并在场景运行时,通过相机查看,你可能会注意到这个对象被错误地剔除了。这是因为 STATIC 对象被认为不会在系统中移动。如果你把这个对象改为 DYNAMIC 后,应该能正确地更新剔除。

  • 有几种 portal_modes ,在主文档中有描述。

  • 试着在运行时,从脚本中调用 set_portal_active() 来打开和关闭入口。

  • 如果你选择了入口,应该可能看到出现4个手柄。试着用鼠标拖动入口的点,看看它对被剔除的对象有什么影响。

  • 如果你选择一个房间并点击工具栏上的Generate Points按钮,它将把房间外体的点储存在房间的检查器中。你现在可以用辅助工具手柄来编辑这些点。