本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面:
Creating instances — Godot Engine (stable) documentation in English
创建实例¶
在前面的部分中,我们看到场景是以树结构组织的节点集合,以单个节点作为其根。您可以将项目拆分为任意数量的场景。此功能可帮助您分解和组织游戏的不同组件。
您可以创建任意数量的场景,并将它们保存为扩展 .tscn
名为“文本场景”的文件。tabel.tscn
上一课的文件就是一个例子。我们将这些文件称为“打包场景”,因为它们打包了有关场景内容的信息。
这是一个球的例子。它由一个名为 Ball 的根节点RigidBody2D节点、一个Sprite2D节点和一个 CollisionShape2D组成,该节点允许球落在墙上并弹跳。
一旦你保存了一个场景,它就像一个蓝图:你可以在其他场景中多次复制它。像这样从模板复制对象称为实例化。
正如我们在上一部分中提到的,实例化场景的行为就像一个节点:编辑器默认隐藏它们的内容。当您实例化 Ball 时,您只会看到 Ball 节点。还要注意每个重复项如何具有唯一的名称。
Ball 场景的每个实例都以相同的结构和属性开始ball.tscn
。但是,您可以单独修改各个实例,例如更改它们的弹跳方式、重量或源场景公开的任何属性。
在实践中¶
让我们在实践中使用实例化,看看它在 Godot 中是如何工作的。我们邀请您下载我们为您准备的球的示例项目: instancing_starter.zip。
在您的计算机上提取存档。要导入它,您需要项目管理器。打开 Godot 可以访问项目管理器,或者如果您已经打开了 Godot,请单击项目 -> 退出到项目列表(在 macOS 上Ctrl + Shift + Q, Ctrl + Option + Cmd + B)
在项目管理器中,单击导入按钮以导入项目。
在出现的弹出窗口中,单击浏览按钮并导航到您提取的文件夹。
双击project.godot
文件将其打开。
最后,单击导入和编辑按钮。
该项目包含两个打包场景:main.tscn
,包含球碰撞的墙壁,以及ball.tscn
。主场景main.tscn
应该会自动打开。
让我们添加一个球作为主节点的子节点。在场景停靠栏中,选择主节点。然后,单击场景停靠栏顶部的链接图标。此按钮允许您将场景实例添加为当前选定节点的子节点。
双击球场景来实例化它。
球出现在视口的左上角。
单击它并将其拖动到视图的中心。
按F5(在 macOS 上Cmd + B)玩游戏。你应该看到它掉下来。
现在,我们要创建 Ball 节点的更多实例。在球仍处于选中状态的情况下,按(在 macOS 上Ctrl-DCmd-D)调用复制命令。单击并拖动以将新球移动到不同的位置。
您可以重复此过程,直到场景中出现多个为止。
再次玩游戏。您现在应该看到每个球都独立下落。这就是实例所做的。每一个都是模板场景的独立再现。
编辑场景和实例¶
实例还有更多。使用此功能,您可以:
-
使用 Inspector 更改一个球的属性而不影响其他球。
-
ball.tscn
通过打开场景并更改那里的 Ball 节点来更改每个 Ball 的默认属性。保存后,项目中 Ball 的所有实例都将看到它们的值更新。
注:更改实例的属性始终会覆盖相应打包场景中的值。
让我们试试这个。打开ball.tscn
并选择 Ball 节点。在右侧的 Inspector 中,单击 PhysicsMaterial 属性将其展开。
2
单击数字字段,键入2
,然后按 ,将其 Bounce 属性设置为Enter。
按F5玩游戏,注意所有的球现在弹跳得更多了。由于 Ball 场景是所有实例的模板,修改它并保存会导致所有实例相应地更新。
现在让我们调整一个单独的实例。单击视口上方的相应选项卡返回主场景。
选择一个实例化的 Ball 节点,并在 Inspector 中将其 Gravity Scale 值设置为10
。
调整后的属性旁边会出现一个灰色的“还原”按钮。
此图标表示您正在覆盖源打包场景中的值。即使您修改了原始场景中的属性,值覆盖也会保留在实例中。单击还原图标会将属性还原为已保存场景中的值。
重新运行游戏并注意这个球现在下落速度比其他球快得多。
注:如果您更改一个实例的值PhysicsMaterial
,它将影响所有其他实例。这是因为PhysicsMaterial
是一种资源,资源是在实例之间共享的。要使资源对于一个实例是唯一的,请在检查器中右键单击它,然后在上下文菜单中单击 Make Unique。
资源是 Godot 游戏的另一个重要组成部分,我们将在后面的课程中介绍。
作为设计语言的场景实例¶
Godot 中的实例和场景提供了一种出色的设计语言,使该引擎与众不同。我们从头开始围绕这个概念设计了 Godot。
我们建议在使用 Godot 制作游戏时放弃架构代码模式,例如模型-视图-控制器 (MVC) 或实体-关系图。相反,您可以从想象玩家将在您的游戏中看到的元素开始,并围绕它们构建您的代码。
例如,您可以像这样分解射击游戏:
你几乎可以为任何类型的游戏想出这样的图表。从玩家的角度来看,每个矩形代表一个在游戏中可见的实体。箭头告诉您哪个场景拥有哪个。
有了图表后,我们建议为其中列出的每个元素创建一个场景来开发您的游戏。您将通过代码或直接在编辑器中使用实例化来构建场景树。
程序员倾向于花费大量时间设计抽象架构并尝试将组件装入其中。基于场景的设计让开发更快更直接,让您专注于游戏逻辑本身。因为大多数游戏组件直接映射到场景,使用基于场景实例化的设计意味着您几乎不需要其他架构代码。
以下是具有大量资产和嵌套元素的开放世界游戏的场景图示例:
想象一下,我们从创建房间开始。我们可以制作几个不同的房间场景,其中的家具布置独特。稍后,我们可以制作一个内部使用多个房间实例的房屋场景。我们将用许多实例化的房屋和我们将放置城堡的大地形创建一个城堡。这些中的每一个都是一个实例化一个或多个子场景的场景。
稍后,我们可以创建代表守卫的场景并将它们添加到城堡中。它们将间接添加到整个游戏世界中。
使用 Godot,可以很容易地像这样迭代您的游戏,因为您需要做的就是创建和实例化更多场景。我们将编辑器设计为可供程序员、设计师和艺术家等人使用。一个典型的团队开发过程可能涉及 2D 或 3D 美术师、关卡设计师、游戏设计师和动画师,他们都在使用 Godot 编辑器。
总结¶
实例化,从蓝图生成对象的过程有很多方便的用途。通过场景,它为您提供:
-
将游戏划分为可重用组件的能力。
-
构建和封装复杂系统的工具。
-
一种以自然方式思考游戏项目结构的语言。