实例化

简介

创建单个场景并向其中添加节点, 这可能适用于小型项目, 但随着项目规模和复杂度的增长, 节点数量可能很快变得无法管理. 为了解决这个问题,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

多个实例

你可以在一个场景中添加任意数量的实例, 可以再次使用 "实例化" 按钮, 也可以点击球的实例, 然后按 Ctrl + D`(MacOS上按 :kbd:`Cmd + D)复制它:

../../_images/instancing_multiball.png

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

../../_images/instancing_multiball.gif

编辑实例

打开 Ball 场景, 点击 PhysicsMaterial 展开, 然后设置 Bounce 属性为 1.

../../_images/instancing_physicsmat2.png

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

也可以只调整个别实例. 先将 Bounce 设回 0 , 然后在 Main 场景中, 选择一个要修改的球. 默认情况下在实例间共享同一个 PhysicsMaterial 这样的资源, 因此修改前需要使其独立于其他实例. 点击属性面板右上方的工具按钮, 选择 "转为独立子资源", 并将 Bounce 设置为 1 , 测试修改后的效果.

../../_images/instancing_property.png

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

总结

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