书接上回。这次先来简单认识一下Godot的基本界面和基本的开发流程,试着写一个Hello World。
启动编辑器(还记得你下到哪里去了吗),我们会看到这样一个界面。这是Godot的项目管理器。Godot同样以项目(project)的概念来组织开发中的游戏。
建议在右上角将语言设置为英文,后续文章以英文界面讲解。目前Godot仍然很难算是主流游戏引擎,互联网上的中文资料相对较少,而界面翻译是公开交由社区翻译的,质量没有完全保证(不是“完全没有”保证)。用英文界面可以更方便地查找一些问题和资料。在后续内容中,我会尽量给出各UI文本、选项、术语的中英文。
对于第一次使用来说,下方的项目列表是空的。首先需要新建项目。点击New(新建)按钮新建项目。显示如下对话框:
一行为项目名称,第二行为保存路径。如果所选路径不是空文件夹,则会看到如图的黄色警告信息,建议你选择空文件夹。此时可以点击上方的Create Folder(创建文件夹)按钮来快速以项目名称为名新建文件夹。
下方的Renderer(渲染器)选项用以按需选择不同类型的渲染器。
Foward+:仅支持桌面平台。支持高级3D图形。伸缩性高。渲染简单场景相对较慢。
Mobile:支持移动平台和桌面平台。3D图形不如Forward+高级。渲染简单场景更快。
Compatibility:支持移动平台、桌面、web平台。针对低端、旧设备。使用OpenGL作为后端。
对于这个简单的起步项目来说不用想那么多。默认即可。渲染器也可以在创建项目后随时更改,但是场景可能需要做出相应调整。
按下Create & Edit(创建并编辑)。随后显示Godot编辑器的主界面:
接下来逐一简要介绍各面板作用,稍后再具体用到时再详细介绍。
视野正中央的是视口(viewport),目前显示的是3D视图。不过这里的显示内容会根据正在编辑的内容发生变化。其上方有四个图标:
目前3D图标以高亮显示,表明该面板中展示的是场景的3D预览。这个面板会在不同的选项下展示不同的内容,你可以依次点击这四个选项看看显示有什么不同。
左侧是场景(scene)面板。此处展示了当前已打开场景的节点树。目前未打开任何场景,所以这里提示“创建根节点”。
下方是文件系统(file system)面板。游戏的所有素材(也称“资产”,assets)都以文件目录树的形式展示在这里。
右侧面板显示的是节点的检视(insepct)面板,即展示节点详细信息的面板。此时没有选中任何节点,因此没有内容。
左上角的菜单和右上角的按钮我们在需要的时候再进行讲解。现在先来创建一个场景。我们从2D场景开始。
先按照惯例,找个地方输出一下Hello World。
在场景面板中,选择2D Scene(2D场景)新建一个2D场景。右侧面板的视口自动切换到了2D场景模式,展示了当前场景的状况:
需要注意的是,新场景随时可创建,但不会自动保存。可以看到上方的标签中显示为“unsaved”,意指当前场景是为保存的场景。后面的星号则表示当前场景已经发生修改。
按下快捷键Ctrl+S,或者点选左上方菜单Scene-Save Scene保存当前场景。在弹出的对话框中为场景取一个名字(比如main),然后点击Save(保存)。在文件系统面板中会出现保存的场景。可以看到,场景的图标是场记板形象,后缀名为tscn(scn可以想到是scene,但是t是哪里来的我没想明白,可能是tree?)。以后我们就可以随时打开已保存的场景。
文件系统面板中和系统文件管理器一样,可以随时创建文件夹来组织其中的文件。其中显示的res://文件夹相当于根文件夹,这里对应的是Godot项目(在电脑的文件系统中)的根文件夹。res是resource(资源)的缩写。
在其上单击右键弹出的菜单中,可以找到Create New(新建)的选项。这里可以找到新建文件夹和场景等选项。Open in File Manager选项可以在系统的文件管理器中打开文件所在目录。
尽管这个场景非常简陋,或者说什么都没有,但是对于Godot来说已经勉强可以称得上可以运行的游戏了。
目光移至右上方。按下播放键或对应的快捷键F5(macOS为Command+B)即可启动当前打开的项目并游玩。
此选项表明无明确主场景。Godot和诸多编程语言一样,需要一个场景作为主(main)场景作为游戏启动时打开的场景。我们可以直接选择当前场景(Select Current)作为主场景,或者选择(select)指定的场景。也可以在文件系统面板中在指定场景上单击右键选择设为主场景。
启动之后,我们会看到一个新的窗口弹出来,这就是运行我们的游戏的窗口。当然现在什么也没有。
游戏运行过程中,第一个图标可以重新启动游戏。而表示暂停和停止运行的两个图标也变成了可用状态。
此外,也可以选择右上角带播放图标的场记板按钮来启动当前场景:
做游戏终归要编程(就算那些看起来不像代码的节点编辑器那也叫编程)。要输出Hello World也得编程。
Godot中的脚本需要附加在某个节点上。现在在场景中唯一的节点上单击右键选择附加脚本(attach script)或者点击场景面板上方、搜索框右侧的带加号的脚本按钮。弹出新建脚本的对话框:
输入焦点自动聚焦到路径(Path)一栏,这里是脚本保存的路径。如果我们选择根节点并尝试附加脚本,文件名默认为场景的名称。如果选择非根节点则以节点名称为默认名称。可以注意到,Godot的GDScript文件后缀名为gd。
右侧文件夹图标可以打开文件对话框选择指定保存位置。此外,如果在这里选中已存在的脚本文件可以复用我们已经编写好的脚本。
Language(语言)一栏是选择脚本语言。标准版的Godot这一栏只有GDScript,而.NET版的可以选C#。暂不涉及C#,所以默认GDScript就好。
Inherits(继承)一栏用以选择脚本对应的基类,它和所选节点的类型有关。这里不需要修改。这里略微涉及一些面向对象编程的概念,后续内容中会更详细地讲解。
Template(模板)顾名思义,会在新建脚本时自动插入一些基本的代码。这里保持原样即可。
下方的方框中有两行绿色的字,表示我们的脚本路径和名称是符合要求的,可以创建新的脚本。点击创建(Create)按钮创建脚本。脚本文件随即保存到了相应的路径,主窗口中的内容也自动切换为脚本显示模式。场景面板中的节点也发生了变化:
可以看到,已附加脚本的节点右侧会显示脚本图标。上方附加脚本的按钮上的加号变成了叉。这个按钮现在变成了分离(Detach)脚本的按钮。detach是attach的反义词。这里不叫“删除脚本”,因为脚本可以复用。同一个脚本可以附加到多处,而且也可以随时把它从这些节点上拿下来。脚本文件被分离下来并不会删除脚本文件。
主视口变成了脚本编辑器(也可以点击节点树中节点右侧的脚本图标打开脚本)。显示的是已打开的main.gd中的内容。右侧占据最多空间的就是代码的内容。
现在我们先来完成Hello World。将第一个pass这一行改成print("Hello World"),就像这样:
需要注意:print前需要留有一个tab。这是GDScript确定代码块层次的要求。并且默认配置为tab而非空格。
可能你已经注意到,在下方弹出的面板中显示了一条信息:
输出(Output)面板类似于我们所说的控制台或者终端,这里会输出我们游戏和引擎本身的各种诊断信息。代码中的print输出的内容也是输出到这里。
按照惯例输出Hello World已经完成了。但是这很难说像一个游戏。说是游戏,至少得有点会动的图像,最好还能操作一下对吧!
首先试着给游戏添加一个sprite。Sprite这一概念喜欢游戏的读者应该不会太陌生,总之很多时候指的是(特别是)2D游戏中的各类2D图像元素。Sprite也被称为“精灵”。
在刚才的场景中,在根节点上单击右键选择添加子节点(Add Child Node),或者快捷键Ctrl+A,又或者点击上方的加号图标,弹出添加节点的对话框:
中间的树形列表显示了所有Godot内置的节点类型,它们有着各不相同的功能。节点之间的层次关系体现了它们的继承关系,简单来说,次级节点继承了上级节点的功能,并且添加了更多功能,或者修改部分上级节点的功能。
我们在这里选择Sprite2D节点。可以试着在列表中找到它,也可以直接在搜索框中输入sprite:
点击Create创建Sprite2D节点到场景中。场景面板的节点树中出现了Sprite2D。之前我们的主视口切换为了脚本编辑器,现在按下2D按钮切换到2D场景视图。当然,里面还是什么都没有。
现在点击场景节点树中的Sprite2D节点选中它,可以看到右边的检视(Inspect)面板中发生了变化:
这里显示的就是当前选中节点的各项属性。属性很多,但是我们目前要关注的是纹理(texture)。它会决定sprite的基本外观,这些外观通常来自一些图片素材。可以看到当前的纹理是空的(empty)。你可以试着点击右侧的下拉按钮,弹出的选项很多,它们是Godot中内置的各种不同类型的纹理。我们现在可以直接无视,用最简单粗暴的方法为它添加纹理。
在文件系统面板中,我们有一个每个Godot项目都默认导入的icon.svg。这是Godot的logo。现在把它拖到检视面板中的Texture属性右侧,拖动过程中这个方框会蓝色高亮,表示操作中的项目是可以放到这里的:
下方会显示当前Texture的概要,点一下Texture右边的框可以收起它。
鼠标放在缩略图左侧的图标上,它会告诉我们当前Texture属于CompressedTexture2D(2D压缩纹理)。这是Godot自动为我们用这个图片创建的纹理资源。现在主视口中的画面中应当可以看到一个Godot的机器人logo。
在2D场景视图中,可以用鼠标中键平移(pan)视图,也可以按下G或者点击上方的手型图标。
现在尝试启动游戏,可以看到这个Sprite只显示了一部分在画面中。
值得注意的是,我们可以在2D场景视图中看到一个颜色很淡的蓝紫色方框。这实际上就是一个用来参考场景中各元素位置的参照物。 它的大小和窗口大小是对应的。
我们先把这个sprite移动一下,便于能够在画面中看到它的全貌。要在场景中操作sprite,需要先选中它。此时它可能已经被选中,选中时它会呈现这样的状态:
同时左上方的鼠标指针图标也高亮显示已被激活,这是选中模式的图标。如果你处于其他操作模式,可以按下快捷键Q回到选中模式,然后点击这个logo选中它。
在橙色边框内拖动鼠标可以移动sprite的位置,而边框周围的红点可以对其进行缩放。将其拖到场景中间,再次启动游戏就可以看全它了。
在刚才的操作过程中,我们实际上是在修改sprite的变换 (transform)的位置(position)属性。你可以在Output面板中看到我们的操作记录:
同样,在右侧的检视面板中,Node2D板块下也能看到相应变化:
此外也可以在这里直接修改其位置。对于Node2D来说,它的transform包含位置、旋转(rotation)、缩放(scale)、倾斜(skew)。前三者最常用。可以试着自己随意摆弄一下这几个属性看看sprite发生了什么变化。
由于是2D节点,在2D场景中只涉及两个轴,即X和Y。这里的位置和缩放也只有两个轴。旋转实际上就是围绕垂直于屏幕方向的“不存在的Z轴”进行的,所以这里的旋转属性是一个标量(一个数字)。
目光回到场景视图,可以看到视图中有横竖两条代表坐标轴的直线,分别代表X轴和Y轴:
由此可见,Godot的2D坐标系左上角是原点((0, 0)),横向为X轴,纵向为Y轴。
好了,现在画面里有点东西了,但是我们还是没法操作。要让游戏接受操作,我们也需要给它添加脚本。
这次我们选中场景面板节点树中的Sprite2D,为其添加脚本。在弹出的新建脚本对话框中,可能会出现一条警告(如果你没有给这个sprite节点改名的话):
对于非根节点,为它新建脚本默认名称为节点名。由于Sprite2D是内置节点的名称,所以这里有这条警告。
我们将其命名为logo,或者其他你喜欢的名称。然后开始编辑。
先从简单的开始。比如我们想在按下D键后,这个logo向右移动一段距离。换句话说,我们想改变logo的位置。再进一步说,想要让logo的position属性的x加上某个值。
在脚本模板自动添加的代码中,我们可以看到两个东西一个_ready一个_process。这是两个函数,两个特殊的函数。实际上这两个东西上面的各自有一行字,介绍了它们的作用。_ready会在其所附着的节点首次进入场景树时调用;_process会在游戏引擎处理每一帧时调用。之前我们那个脚本简单地在_ready中进行,这次我们在_process中试一下。将代码改动如下:
先启动游戏看看效果。这个logo会自动向右不断移动!
position.x += 5会给position的x坐标加5,得到的结果再交给position.x。由于_process会每帧调用, 所以每一帧logo都会向右移动5个像素单位。
好了,接下来,我们来实现刚才说好的,要按了D键之后它才往右跑。那么我们要怎样才能知道玩家按下了D键呢?我们先来看一个设置。在左上方菜单中,选择Project-Project Settings(项目设置)。在显示的设置窗口中选中Input Map(输入映射)标签页:
相信玩家朋友对于这些字眼不会太陌生。这里类似于游戏中按键绑定。目前下方的列表是空的,也可以点击Show Built-in Actions(显示内置操作)开关显示引擎预定义的各种绑定。我们试着来创建一个自己的操作(action)。在占位文本为Add New Action(添加新操作)的文本框中输入move_right或者你喜欢的名称,然后点击右侧的Add按钮。随后下方的操作列表中多了一行。点击右边的加号弹出事件配置(Event Configuration)对话框,在这里可以配置和该操作绑定的按键。当然,加号旁边的垃圾桶图标自然是删除操作的功能。
直接按下D键,或者在下方列表中直接选中。按下OK即可。现在操作列表中move_right操作多了一个子节点,这是我们刚才绑定的按键。这样一来,按下D键时就相当于我们进行了move_right这一操作。
关闭项目设置窗口,回到代码编辑器。修改_process的代码如下(为减少重复占用篇幅,未修改部分略去):
现在启动游戏,按下D,logo会走一段,一直按下一直走!
在这里Input.is_action_pressed会检查其参数中指定的操作是否发生,也就是我们刚才自定义的move_right操作是否发生。只有发生了这一事件才会向右移动。
也许你对这些代码还有很多疑问,后续内容中会详细讲解GDScript的基础知识。现在我们就说这么多。我们的Hello World也算是一个是否简单的小游戏了。
现在来做一件“傻事”。我们来让场景中出现一堆logo。在节点树中,选中Sprite2D节点。这里可以用大家喜闻乐见的复制粘贴快捷键。但是要注意!粘贴时要选择其父节点——这里也就是根节点——再粘贴。否则新的节点副本会称为原本的sprite的子节点(当然这样做也可以!你可以看看是怎样的效果!)。就像这样:
记得调整它们的位置,让它们不相互重叠。当然你想要几个都可以,只要你的电脑不卡。这里“复制粘贴”更简单的做法是使用复制(Duplicate)功能,快捷键Ctrl+D。节点的右键菜单也可以找到。
注意,节点树中我们复制出来的节点上也能看到脚本图标,说明它身上的脚本也被复制了。 但是可以看到文件系统中脚本并没有出现多个副本,这说明脚本作为一种资源也是大家共享的(除非为它们单独设置新脚本)。
如果我们每次要用到这个logo都要新建Sprite2D然后设置纹理再附加脚本就太麻烦了。我们可以直接把这个logo保存为单独的场景,实现复用。这是Godot节点场景系统“简单又强大”的具体体现之一。
选中任意logo副本,选择右键菜单中的Save Branch as Scene(保存分支为场景),在弹出的对话框中为其命名并选择保存位置即可保存为场景。
也可以将节点直接拖到文件系统面板中实现同样的操作。
同样,将已保存的场景直接拖到节点树中或者右侧场景视图中,可以直接将它们作为当前场景的一部分带入场景的节点树中!
直接以其他场景加入到当前场景中的节点右侧会显示一个场记板图标,点击它可以直接打开对应场景。
这篇文章中,我们依照国际惯例完成两重意义上的Hello World!
评论区
共 15 条评论热门最新