本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面:
Creating your first script — Godot Engine (stable) documentation in English
创建你的第一个脚本¶
在本课中,您将编写您的第一个脚本,使用 GDScript 使 Godot 图标转圈。正如我们在简介中提到的,我们假设您具有编程基础。为方便起见,等效的 C# 代码已包含在另一个选项卡中。
参考:要了解有关 GDScript、其关键字和语法的更多信息,请前往GDScript 参考。
参考:要了解有关 C# 的更多信息,请访问C# 基础知识页面。
项目设置¶
请创建一个新项目以从头开始。你的项目应该包含一张图片:Godot 图标,我们经常在社区中使用它来制作原型。
我们需要创建一个 Sprite2D 节点来在游戏中显示它。在场景停靠栏中,单击其他节点按钮。
在搜索栏中输入“Sprite2D”以过滤节点,然后双击 Sprite2D 创建节点。
您的场景选项卡现在应该只有一个 Sprite2D 节点。
Sprite2D 节点需要一个纹理【Texture】来显示。在右侧的 Inspector 中,您可以看到 Texture 属性显示为“[empty]”。要显示 Godot 图标,请单击文件并将文件icon.svg
从文件系统停靠栏拖动到纹理槽中。
注:您可以通过在视口上拖放图像来自动创建 Sprite2D 节点。
然后,单击并拖动视口中的图标,使其在游戏视图中居中。
创建新脚本¶
要创建新脚本并将其附加到我们的节点,请右键单击场景停靠栏中的 Sprite2D,然后选择“附加脚本”。
出现附加节点脚本窗口。它允许您选择脚本的语言和文件路径,以及其他选项。
将模板字段从“节点:默认”更改为“对象:空”以从一个干净的文件开始。默认保留其他选项,然后单击“创建”按钮创建脚本。
脚本工作区应该出现在您sprite_2d.gd
打开的新文件和以下代码行的情况下:
GD脚本 |
extends Sprite2D |
C# |
using Godot; public partial class MySprite2D : Sprite2D |
每个 GDScript 文件隐式地是一个类。关键字extends
定义此脚本继承或扩展的类。在这种情况下,它是Sprite2D
,这意味着我们的脚本将可以访问 Sprite2D 节点的所有属性和函数,包括它扩展的类,如Node2D
、CanvasItem
和 Node
。
注:在 GDScript 中,如果您省略带有关键字的行extends
,您的类将隐式扩展RefCounted,Godot 使用它来管理应用程序的内存。
继承的属性包括您可以在 Inspector 停靠栏中看到的属性,例如我们节点的texture
.
注:默认情况下,Inspector 在“Title Case”中显示节点的属性,大写单词之间用空格分隔。在 GDScript 代码中,这些属性位于“snake_case”中,它是小写字母,单词之间用下划线分隔。
您可以将鼠标悬停在检查器中的任何属性名称上,以在代码中查看描述及其标识符。
Hello World!¶
我们的脚本目前没有做任何事情。让我们让它打印文本“Hello, world!” 到输出底部面板开始。
将以下代码添加到您的脚本中:
GD脚本 |
func _init(): |
C# |
public MySprite2D() { GD.Print("Hello, world!"); } |
让我们分解一下。关键字func
定义了一个名为 的新函数 _init
。这是我们类的构造函数的特殊名称。如果您定义此函数,引擎会 _init()
在内存中创建每个对象或节点时调用它。
注:GDScript 是一种基于缩进的语言。该行开头的选项卡表示print()
代码工作所必需的。如果您省略它或没有正确缩进一行,编辑器将以红色突出显示它并显示以下错误消息:“预期缩进块”。
如果您还没有保存场景,可以将场景保存为sprite_2d.tscn
,然后按F6(在 macOS 上Cmd + R) 运行它。查看展开的输出底部面板。它应该显示“Hello, world!”。
删除_init()
函数后,你只剩下一行代码了。extends Sprite2D
转动¶
是时候让我们的节点移动和旋转了。为此,我们将在脚本中添加两个成员变量:以像素/秒为单位的移动速度【speed】和以弧度/秒为单位的角速度【angular_speed】。在extends Sprite2D
之后添加以下内容【GDScript】。
GDScript |
var speed = 400 var angular_speed = PI |
C# |
private int _speed = 400; private float _angularSpeed = Mathf.Pi; |
成员变量位于脚本顶部附近,在任何“扩展”行之后,但在函数之前。每个附有此脚本的节点实例都将拥有自己的speed
和angular_speed
属性副本。
注:Godot 中的角度默认以弧度为单位,但如果您更喜欢以度数计算角度,则可以使用内置函数和属性。
要移动我们的图标,我们需要在游戏循环中的每一帧更新它的位置和旋转【状态】。我们可以使用类Node
的虚函数_process()
。如果您在任何 Node派生类中定义它,例如 Sprite2D,Godot 将每帧调用该函数并向其传递一个名为delta
的参数,即自上一帧以来经过的时间。
注:游戏通过每秒渲染许多图像来工作,每个图像称为一个帧,并且它们在循环中进行。我们以每秒帧数 (FPS) 衡量游戏生成图像的速率。大多数游戏的目标是 60 FPS,尽管您可能会发现在速度较慢的移动设备上为 30 FPS,或者在虚拟现实游戏中为 90 到 240 FPS。
引擎和游戏开发人员尽最大努力以恒定的时间间隔更新游戏世界和渲染图像,但帧渲染时间总是有微小的变化。这就是为什么引擎为我们提供了这个增量时间值,使我们的运动独立于我们的帧率。
在脚本底部,定义函数:
GDScript |
func _process(delta): rotation += angular_speed * delta |
C# |
public override void _Process(double delta) { Rotation += _angularSpeed * (float)delta; } |
关键字func
定义了一个新函数【GDScript】。在它之后,我们必须在括号中写下函数的名称和参数。冒号结束定义,后面的缩进块是函数的内容或指令。
注:请注意_process()
, 【类似于】_init()
, 是如何以前导下划线开头的。按照惯例,Godot 的虚函数,也就是说,您可以覆盖以与引擎通信的内置函数,以下划线开头。
函数内的代码行,rotation += angular_speed * delta
rotation
Node2D
Sprite2D,
其作用是每帧增加精灵【Sprite】的旋转。这里,【rotation】是一个继承自【Node2D】类的属性,【Sprite2D类】扩展了。它控制我们节点的旋转并使用弧度。
注:在代码编辑器中,您可以按住 Ctrl 键并单击任何内置属性或函数,例如position
、rotation
,或者_process
在新选项卡中打开相应的文档。
运行场景以查看 Godot 图标就地转动。
注:在 C# 中,请注意_Process()
参数delta为double类型
. 因此,当我们将其应用于旋转时,我们需要将其转换为float。
移动¶
现在让节点移动。在函数内添加以下两行_process()
,确保新行的缩进方式与它们之前的行相同。rotation += angular * delta
GDScript |
var velocity = Vector2.UP.rotated(rotation) * speed position += velocity * delta |
C# |
var velocity = Vector2.Up.Rotated(Rotation) * _speed; Position += velocity * (float)delta; |
正如我们已经看到的,var
关键字定义了一个新变量。如果将它放在脚本的顶部,它会定义类的一个属性。【这里用】在函数内部,它定义了一个局部变量:它只存在于函数的范围内。
我们定义了一个名为velocity
的局部变量,它是一个表示方向和速度的二维向量【Vector2】。为了使节点向前移动,我们从 Vector2 类的常量Vector2.UP
开始,即一个向上的向量,并通过调用 rotated()
上的方法来旋转它。这个表达式Vector2.UP.rotated(rotation)【为】
一个相对于我们的图标指向前方的向量。乘以我们的speed
属性,它给了我们一个速度,我们可以用它来向前移动节点。
我们添加【velocity * delta
position】
到节点【的位置(position)属性】以移动它。位置【position】本身是Vector2类型,是 Godot 中的内置类型,表示 2D 向量。
运行场景以查看 Godot 在原地转圈【运行效果】。
注:像那样移动节点不会考虑与墙壁或地板的碰撞。在您的第一个 2D 游戏中,您将学习另一种在检测碰撞时移动对象的方法。
我们的节点目前自行移动。在下一部分 Listening to player input中,我们将使用玩家输入来控制它。
完整脚本¶
这是完整的sprite_2d.gd
文件以供参考。
GDScript |
extends Sprite2D var speed = 400
var velocity = Vector2.UP.rotated(rotation) * speed position += velocity * delta |
C# |
using Godot; public partial class MySprite2D : Sprite2D public override void _Process(double delta) Position += velocity * (float)delta; |