无论你是想要从事的职业还是休闲爱好,游戏开发都是一项有趣而有意义的工作。现在是开始游戏开发的最佳时机。现代化的编程语言和工具使构建高质量的游戏并将其发布到全世界变得比以往任何时候都容易。如果你正在阅读本书,那么你已经踏上了制作梦想中的游戏的道路。
本书是对Godot游戏引擎及其2018年初发布的新3.0版本的介绍。Godot 3.0拥有大量新特性和功能,使其成为昂贵的商业游戏引擎的有力替代品。对于初学者来说,它提供了一种学习基本游戏开发技术的友好方式。对于更有经验的开发人员来说,Godot是一个强大的,可定制的,开放的工具,可以将您的愿景变为现实。
这本书采用了基于项目的方法,将向你介绍引擎的基本原理。它由5款游戏组成,旨在帮助你更好地理解游戏开发概念以及如何将其应用于Godot。在此过程中,您将了解Godot如何工作,并吸收可以应用到您的项目中的重要技术。
本节包含了作者作为教师和讲师的经验,给读者的一些一般性建议。在你学习本书时,请记住这些建议,特别是当你对编程非常陌生的时候。
尽量按照书中的项目顺序进行。后面的章节可能会建立在前面章节介绍的主题上,在那里会有更详细的解释。当你遇到不记得的东西时,回过头来复习一下前面章节中的那个主题。没有人在安排你的时间,而且快速完成本书没有任何奖赏。
这里有很多材料需要吸收。如果你一开始不懂,也不要感到气馁。我们的目标不是要在一夜之间成为游戏开发专家–那是不可能的。重复是学习复杂主题的关键;你越是使用Godot的功能,它们就会开始显得越熟悉和容易。当您完成第7章 "附加主题 "时,试着回顾一下第2章 硬币冲刺。你会惊讶于与第一次阅读相比,你会明白更多的东西。
如果你使用的是本书的PDF版本,请抵制复制和粘贴代码的诱惑。自己输入代码会让你的大脑更多的参与进来。这类似于在讲座中做笔记比单纯听讲能帮助你更好地学习,即使你从来没有读过笔记。如果你是个打字慢的人,它也会帮助你锻炼打字速度。简而言之:你是一个程序员,所以要习惯打代码!
新游戏开发者所犯的最大错误之一就是承担了一个比他们能够处理的更大的项目。在刚开始的时候,将项目的范围尽可能的缩小是非常重要的。 如果您完成两个或三个小型游戏,那么与完成一个大型,不完整的项目已经超出了您的管理能力相比,您将获得更大的成功(并学到更多)。
你会注意到,本书中的五种游戏都非常严格地遵循了这一策略。它们的范围都很小,这既是出于实用的原因–可以合理地融入到书本大小的课程中–也是为了继续专注于教你基础知识。当你构建它们时,你可能会发现自己马上就会想到额外的功能和游戏元素。如果飞船有升级功能会怎样?如果角色可以进行墙壁跳跃呢?
想法很棒,但是如果您还没有完成基本项目,请将其写下来并保存以备后用。不要让自己被一个又一个酷炫的点子分散了注意力。开发者把这称为功能蠕变,这是一个陷阱,导致了许多未完成的游戏。不要成为它的受害者。
在每个新概念之后,尤其是在每个章节之后,请您花一些时间来吸收新信息,然后再学习下一个。 您会发现您不仅保留了更多信息,而且可能会更喜欢该过程。
游戏开发是复杂的,涉及到各种各样的知识和技能。为了构建一个现代游戏,你需要大量的底层技术,然后才能做出实际的游戏本身。想象一下,在你开始编程之前,你必须先建立自己的电脑,编写自己的操作系统。如果你真的要从头开始,构建你所需要的一切,那么游戏开发也会是如此。
此外,每个游戏都有一些共同的需求。例如,不管是什么游戏,都需要在屏幕上画东西。如果已经写好了这样做的代码,那么重用它比为每个游戏重新创建代码更有意义。这就是游戏框架和引擎的作用。
游戏框架是一套带有辅助代码的库,协助构建游戏的基础部分。它不一定提供所有的部分,你可能仍然需要写大量的代码来将所有的东西联系在一起。正因为如此,用游戏框架构建一款游戏可能会比用完整的游戏引擎构建的游戏花费更多的时间。
游戏引擎是一个工具和技术的集合,旨在通过消除为每个新的游戏项目重新发明轮子的需要来简化游戏制作过程。它提供了一个普遍需要的功能框架,而这些功能往往需要投入大量的时间来开发。
这里列出了游戏引擎将提供的一些主要功能:
渲染(2D和3D)
:渲染是将游戏显示在玩家屏幕上的过程。一个好的渲染管道必须考虑到现代GPU支持,高分辨率显示,以及光照、透视和视口等效果,同时保持非常高的帧率。
物理
:构建一个强大而准确的物理引擎是一项艰巨的任务。大多数游戏都需要某种碰撞检测和响应系统,许多游戏都需要物理模拟,但很少有开发者愿意承担编写一个物理系统的任务,特别是如果他们曾经尝试过这样做。
平台支持
:在今天的市场上,大多数开发者都希望能够在多个平台上发布他们的游戏,如游戏机、手机、PC和/或网络。游戏引擎提供了一个统一的导出流程,可以在多个平台上发布,而不需要重写游戏代码或支持多个版本。
通用的开发环境
:通过使用相同的统一界面来制作多个游戏,你不必在每次开始一个新项目时重新学习一个新的工作流程。
此外,还会有一些工具来协助实现一些功能,如联网、简化处理图像和声音的过程、动画、调试、关卡创建等。通常情况下,游戏引擎会包括从其他工具导入内容的能力,例如用于创建动画或3D模型的工具。
使用游戏引擎可以让开发者专注于构建他们的游戏,而不是创建使游戏运行所需的所有底层框架。对于小型或独立开发者来说,这可能意味着在开发一年而不是三年后发布游戏,甚至根本就没有发布游戏的区别。
目前市场上流行的游戏引擎有几十个,如Unity、Unreal Engine和GameMaker Studio等。需要注意的一个重要事实是,大多数流行的游戏引擎都是商业产品。它们可能需要或不需要任何财务投资来启动,但如果你的游戏赚钱,它们将需要某种授权和/或版税支付。无论你选择什么样的引擎,你都需要仔细阅读用户协议,确保你明白你可以和不可以使用该引擎,以及如果有的话,你可能需要负责哪些隐藏的费用。
另一方面,有一些引擎是非商业性的、开源的,比如Godot游戏引擎,这就是本书的内容。
Godot是一个功能齐全的现代游戏引擎,提供了前文所述的所有功能以及更多。它也是完全免费和开放源码的,在非常宽松的MIT许可证下发布。这意味着没有任何费用,没有隐藏成本,也不需要为您的游戏收入支付版税。你用Godot制作的所有东西100%属于你,这是许多商业游戏引擎所不具备的,它们需要持续的合同关系。对于很多开发者来说,这一点是非常有吸引力的。
如果你不熟悉开源、社区驱动开发的概念,你可能会觉得很奇怪。然而,就像Linux内核、Firefox浏览器和许多其他非常知名的软件一样,Godot并不是由一家公司作为商业产品开发的。取而代之的是,一个由充满激情的开发者组成的专门社区,他们捐出自己的时间和专业知识来构建引擎,测试和修复错误,制作文档等等。
作为一个游戏开发者,使用Godot的好处是巨大的。因为它不受商业授权的限制,你可以完全控制你的游戏到底是如何发行的,在哪里发行的。许多商业游戏引擎限制了您可以制作的项目类型,或者需要更昂贵的许可证来制作某些类别的游戏,例如赌博。
Godot的开源性质也意味着有商业游戏引擎所不存在的透明度。例如,如果你发现某个引擎功能不能满足你的需求,你可以自由修改引擎本身,并添加你所需要的新功能,不需要任何许可。这在调试大型项目时也是非常有帮助的,因为你可以完全访问引擎的内部运作。
这也意味着您可以直接为Godot的未来做出贡献。有关如何参与Godot开发的更多信息,请参见第7章 附加主题。
您可以访问https://godotengine.org/,点击下载最新版本的Godot。本书是为3.0版本编写的。如果你下载的版本在最后有另一个数字(如3.0.3),那也没关系,这只是意味着它包含了3.0版本的更新,修复了错误或其他问题。
当前正在开发3.1版,在您阅读本书时可能已经发布了。 此版本可能包含或可能不包含与本书中的代码不兼容的更改。 请查看GitHub存储库以获取有关本书的信息和勘误表:https://github.com/PacktPublishing/Godot-Game-Engine-Projects
在下载页面,有几个选项值得解释。首先,32位与64位:这个选项取决于你的操作系统和电脑的处理器。如果你不确定,你应该选择64位版本。你还会看到一个Mono版。这是一个专门为C#编程语言打造的版本。不要下载这个版本,除非你打算使用C#与Godot。在写这篇文章的时候,C#的支持还是实验性的,不建议初学者使用。
双击下载的文件将其解压缩,您将拥有Godot应用程序。 (可选)您可以将其拖到程序或应用程序文件夹中。
双击该应用程序以启动它,您将看到Godot的Project Manager窗口。
除了从Godot网站上下载外,还有其他一些方法可以让Godot在电脑上安装。需要注意的是,这种方式安装时,功能上没有区别。以下只是下载应用程序的替代方法:
Steam:如果你在Steam上有账号,你可以通过Steam桌面应用安装Godot。在Steam商店中搜索Godot,然后按照说明进行安装。你可以从Steam应用中启动Godot,它甚至会追踪你的游戏时间。
软件包管理器:如果您使用的是以下操作系统的软件包管理器,您可以通过其正常的安装过程安装Godot。请参阅您的软件包管理器的文档了解详情。Godot可在这些软件包管理器中使用:
像大多数游戏引擎一样,Godot有一个统一的开发环境。这意味着您可以使用相同的界面来处理游戏的所有方面–代码、视觉效果、音频等等。本节是对界面及其部分的介绍。请注意这里使用的术语;当你在编辑器窗口中进行操作时,将在本书中使用这些术语。
在这个窗口中,你可以看到你现有的Godot项目列表。您可以选择一个现有的项目,然后点击运行来玩游戏,或者点击编辑来在Godot编辑器中进行操作(参考下面的截图)。您也可以通过点击新建项目来创建一个新项目:
在这里,你可以给项目起一个名字,并创建一个文件夹来存储它。尽量选择一个能描述项目的名字。此外,请记住,不同的操作系统对文件名中的大写和空格的处理方式不同。最好是坚持使用小写,并使用下划线_,而不是空格,以获得最大的兼容性。
请注意警告信息–在Godot中,每个项目都作为一个单独的文件夹存储在计算机上。项目使用的所有文件都在这个文件夹里。这个项目文件夹之外的任何东西都不会在游戏中被访问,所以你需要把任何图像、声音、模型或其他数据放到项目文件夹中。这使得共享Godot项目变得很方便,你只需要将项目文件夹压缩,你可以放心,另一个Godot用户将能够打开它,而不会丢失任何必要的数据。
当你在给新项目命名时,有一些简单的规则你应该尝试着去遵守,这可能会让你在未来省去一些麻烦。给你的项目取一个能描述它是什么的名字–《巫师战斗竞技场》是一个比《游戏2号》更好的项目名称。在未来,你将永远无法记住2号游戏是哪个游戏,所以要尽可能的描述性。
你也应该考虑如何命名你的项目文件夹和其中的文件。有些操作系统是区分大小写的,并区分My_Game和my_game,而另一些系统则不区分。如果你把你的项目从一台电脑移动到另一台电脑,这可能会导致问题。出于这个原因,许多程序员为他们的项目制定了一个标准化的命名方案,例如。文件名中没有空格,字与字之间用"_"。不管你采用什么命名方案,最重要的是要保持一致。
一旦创建了项目文件夹,"创建和编辑 "按钮将在编辑器窗口中打开新项目。
现在试试:创建一个名为test_project的项目。
如果你使用的是Windows操作系统的版本,当你运行Godot时,你还会看到一个控制台窗口打开。在这个窗口中,你可以看到引擎和/或你的项目产生的警告和错误。这个窗口在macOS或Linux下不会出现,但如果你使用终端程序从命令行启动应用程序,你可以看到控制台的输出。
以下是Godot主编辑器窗口的截图。当您在Godot中构建项目时,您将在这里花费大部分时间。编辑器界面分为几个部分,每个部分提供不同的功能。每个部分的具体术语描述如下:
编辑器窗口的主要部分是视口。这是你在制作游戏时所看到的部分内容。
左上角是主菜单,在这里你可以保存和加载文件,编辑项目设置,并获得帮助。
在顶部的中央是一个工作空间的列表,当你在游戏的不同部分工作时,你可以切换。你可以在2D和3D模式之间切换,也可以在脚本模式下编辑游戏代码。AssetLib是一个你可以下载附加组件和示例项目的地方。参见第7章,附加主题,了解更多关于使用AssetLib的信息。请参考下面的截图:
下面的截图显示了工具栏上的 "工作空间 "按钮。工具栏中的图标会根据你正在编辑的对象种类而改变。底部面板中的项目也会改变,它将打开各种较小的窗口,用于访问特定的信息,如调试、音频设置等:
右上角的Playtest区域的按钮是用来启动游戏和游戏运行时的互动:
项目文件夹内的所有文件都显示在这里,你可以点击文件夹打开它们,查看它们包含的内容。项目中的所有资源都将相对于res://,也就是项目的根文件夹。例如,一个文件路径可能看起来像这样:res://player/Player.tscn。
在右侧的dock,你可以看到几个标签。场景选项卡在视口中显示你正在处理的当前场景。在它下面的 "检查器 "选项卡中,你可以看到并调整你选择的任何对象的属性。请参考下面的截图:
选择 "导入 "选项卡并点击 "文件系统 "选项卡中的文件,可以调整Godot导入纹理、网格和声音等资源的方式,如下截图所示:
当你通过本书中的游戏项目时,你将了解这些项目的功能,并熟悉浏览编辑器界面。然而,在开始之前,你还需要了解其他一些概念。
节点是Godot中创建游戏的基本构件。节点是一个对象,可以代表各种专门的游戏功能。一个给定类型的节点可能会显示图形,播放动画,或代表一个对象的3D模型。节点还包含一个属性集合,允许您自定义其行为。你将哪些节点添加到你的项目中取决于你需要什么功能。这是一个模块化系统,旨在让你灵活地构建你的游戏对象。
在你的项目中,你添加的节点被组织成树状结构。在树状结构中,节点是作为其他节点的子节点添加的,一个特定的节点可以有任何数量的子节点,但只有一个父节点。当一组节点集合成一棵树时,它被称为一个场景,而这棵树被称为场景树。
Godot中的场景通常用于创建和组织项目中的各种游戏对象。您可能会有一个玩家场景,其中包含所有的节点和脚本,使玩家的角色工作。然后,您可能会创建另一个场景来定义游戏的地图:玩家必须穿越的障碍物和物品。然后,你可以使用实例将这些不同的场景组合到最终的游戏中,这一点你将在后面学习。
虽然节点自带各种属性和功能,但任何节点的行为和功能也可以通过给节点附加脚本来扩展。这允许您编写代码,使节点在默认状态下做更多的事情。例如,你可以在场景中添加一个Sprite节点来显示一个图像,但如果你想让这个图像在点击时移动或消失,你就需要添加一个脚本来创建这种行为。
在撰写本文时,Godot为脚本节点提供了三种官方语言:GDScript、VisualScript和C#。GDScript是专用的内置语言,提供了与引擎最紧密的集成,使用起来也最直接。VisualScript还很新,处于测试阶段,在你对Godot的工作原理有很好的理解之前,应该避免使用它。对于大多数项目来说,C#最好是保留在游戏中有特定性能需求的部分;大多数Godot项目不需要这种级别的额外性能。对于那些需要的项目,Godot提供了灵活性,可以在需要的地方结合使用GDScript和C#。
除了三种支持的脚本语言外,Godot本身也是用C++编写的,你可以通过直接扩展引擎的功能来获得更多的性能和控制。关于使用其他语言和扩展引擎的信息,请参见第7章,附加主题。
本书中所有的游戏都使用GDScript。对于大多数项目来说,GDScript是最好的语言选择。它与Godot的应用编程接口(API)结合得非常紧密,是为快速开发而设计的。
GDScript的语法非常接近于Python语言的模式。如果你已经熟悉Python,你会发现GDScript非常熟悉。如果你对另一种动态语言(如JavaScript)很熟悉,你应该会发现它相对容易学习。Python经常被推荐为一种很好的初学者语言,而GDScript也具有这种用户友好性。
本书假设你至少已经有一些编程经验。如果你以前从未编写过代码,你可能会发现它的难度更大一些。学习游戏引擎本身就是一项大任务;同时学习代码意味着你已经接受了一项重大挑战。如果你发现自己对本书中的代码感到吃力,你可能会发现,通过Python入门课的学习将有助于你掌握基础知识。
和Python一样,GDScript也是一种动态类型的语言,这意味着你在创建一个变量时不需要声明它的类型,而且它使用whitespace(缩进)来表示代码块。总的来说,使用GDScript来处理你的游戏逻辑的结果是你写的代码更少,这意味着更快的开发和更少的错误修复。
为了让你了解GDScript的样子,这里有一个小脚本,它可以让sprite以给定的速度在屏幕上从左到右移动:
extends Sprite
var speed = 200
func _ready():
position = Vector2(100, 100)
func _process(delta):
position.x += speed * delta
if position.x > 500:
position.x = 0
如果这对你来说还没有意义,不要担心。在接下来的章节中,你将会写出大量的代码,这些代码将伴随着对其工作原理的解释。
在这一章中,我们向你介绍了游戏引擎的概念,特别是Godot。最重要的是,你下载了Godot并启动了它!
您学习了一些重要的词汇,这些词汇将在本书中提到Godot编辑器窗口的各个部分时使用。你还学习了节点和场景的概念,它们是Godot的基本构件。
你还收到了一些关于如何处理本书中的项目和一般游戏开发的建议。如果你在阅读本书时发现自己有挫折感,请回过头来重读一般建议部分。有很多东西需要学习,如果第一次没有全部理解也没关系。在本书的学习过程中,你会做出五种不同的游戏,每一种游戏都会帮助你更多地理解事情。
你已经准备好进入第二章 硬币冲刺,在这里你将开始构建你在Godot的第一个游戏。