实例化

简介

创建单个场景并向其中添加节点,这可能适用于小型项目,但随着项目规模和复杂度的增长,节点数量可能很快变得无法管理。为了解决这个问题,Godot允许一个项目被分成许多场景。这提供了一个强大的工具,有助于组织游戏的不同组件。

场景与节点 里,已了解场景是以树结构组织的节点集合,并由单个节点作为树的根节点。

../../_images/tree.png

可以创建任意多的场景并将其保存到磁盘。以这种方式保存的场景被称为“打包场景”,并会有个 .tscn 扩展名。

../../_images/instancingpre.png

一旦场景被保存,它就可以被实例化到另一个场景中,就像它是任何其他节点一样。

../../_images/instancing.png

在上面的图片中,场景B作为实例被添加到A中。

通过示例实例化

要了解实例化如何工作,我们先下载一个示例项目: instancing.zip

解压该项目到任意位置。然后打开Godot,用 导入(Import) 按钮将项目添加到到项目管理器中:

../../_images/instancing_import.png

浏览到解压到的文件夹,然后打开可以在其中找到 project.godot 文件。执行此操作后,新项目将显示在项目列表中。按 编辑(Edit) 按钮编辑项目。

该项目包含两个场景:Ball.tscnMain.tscn。 ball 场景使用 RigidBody2D 来提供物理行为,而主场景有一组用于与球碰撞的障碍物(使用 StaticBody2D)。

../../_images/instancing_ballscene.png ../../_images/instancing_mainscene.png

打开 Main 场景,然后选择根节点:

../../_images/instancing_mainroot.png

我们要添加一个 Ball 场景的实例,作为 Main 场景的子节点。点击“链接”形状的按钮(悬浮框写着 实例化场景文件作为节点。)然后选择 Ball.tscn 文件。

../../_images/instancing_linkbutton.png

这个球会被放置在屏幕区域的左上角(即屏幕坐标 (0, 0))。点击并将球拖到场景顶部中心附近的某处:

../../_images/instancing_placeball.png

按下 运行(Play),会看到球落到场景底部:

../../_images/instancing_playbutton.png

多个实例

You can add as many instances as you like to a scene, either by using the “Instance” button again, or by clicking on the ball instance and pressing “Duplicate” (Ctrl + D):

../../_images/instancing_multiball.png

再次运行场景,这些球都会落下来。

../../_images/instancing_multiball.gif

编辑实例

Open the Ball scene and add a PhysicsMaterial by opening the “Physics Material Override” dropdown in the Inspector dock and selecting “New PhysicsMaterial”.

../../_images/instancing_physicsmat1.png

然后,通过点击它来展开材质,并将 反弹 属性设置为 1

../../_images/instancing_physicsmat2.png

按下 播放(Play),请注意现在所有被实例化的球会变得更有弹性。因为被实例化的球基于保存过的场景,更改该场景会影响所有实例。

也可以调整单个实例。 将反弹值设置回 0,然后在 Main 场景中,选择实例球中的一个。 像 物理材质 这样的资源默认在实例之间共享,所以我们需要使它成为唯一的。点击向下箭头并选择 独立化(Make Unique)。 将其 反弹 设置为 1 并按“播放”。

../../_images/instancing_property.png

可以注意到调整后的属性旁边有一个 还原(revert) 按钮。当这个按钮出现,意味着修改了这个实例化场景属性,覆盖了它原有的值。即便再次修改原场景的属性,它的值也会保持不变。按下还原按钮将会把属性值还原为原场景设定值。

总结

当您想创建同一对象的多个副本时,实例化会非常有用。您也可以使用GDScript创建实例(请参阅 编写脚本(续))。