跳转到内容

Godot 游戏引擎/编程指南

75% developed
来自 Wikibooks,开放世界中的开放书籍

三种语言

[编辑 | 编辑源代码]

Godot 有三种主要的编程(或脚本)语言,如果你拥有编译了 Mono 的 Godot 版本,还有一种额外的第四种语言。 然而,你可以获得非官方语言,甚至可以创建自己的语言!

GDScript(“.gd” 文件扩展名)是 Godot 的主要语言。 它是一种自定义语言,与 Godot 的“场景”系统协同工作。 它也非常容易使用。 Godot 的开发者表示,你可以在不到一个小时的时间里学会 GDScript。

示例“Hello world!” 程序

func _ready() -> void:
    # This is a comment. It isn't shown in the game.
    print("Hello world!")

我建议你从一开始就使用 GDScript,因为它是最容易使用的,并且还支持自动完成功能,这非常有用。 本书将使用 GDScript 作为主要的编程语言。

有趣的事实:Godot 的开发者在决定创建更适合 Godot 的自定义脚本语言之前,曾尝试过 Python 和 Swift。 因此,这种语言与这两种语言非常相似。

有关更多信息,请参阅 GDScript 章节.

VisualScript

[编辑 | 编辑源代码]

VisualScript(“.vs” 文件扩展名)是 Godot 的可视化语言,它使用用户友好的界面来创建代码。 它缺乏 GDScript 中的许多功能,但可以用于创建例如对话树。

然而,这种语言在 Godot 4.x 中已被弃用[1],因为只有 0.5% 的用户实际使用过这种语言。 它仍然可以在 Godot 3.x 中使用,并且可能会在将来作为扩展添加到 Godot 4 中。


GDExtension (Godot 4.x 之前的 NativeScript)

[编辑 | 编辑源代码]

GDExtension 允许你在不重新编译引擎的情况下运行 c 和 c++ 代码。 这使你能够为计算量很大的任务创建超高速代码。

Godot 4.1+ 中的 GDExtension 向前兼容,这意味着为 4.2 制作的 GDExtensions 可以在 4.3 中运行,反之则不行。 但是,这不是保证,因为在将来为了修复 bug 并添加关键功能,兼容性可能会被破坏。

与引擎模块不同,GDExtension 不需要编译引擎的源代码。 它使你能够访问大多数可用于 GDScript 和 C# 的 API,让你能够使用完全控制的性能编写游戏逻辑。 如果你需要快速代码并且希望将其作为附加组件分发到资产库,它非常理想。

GDExtension 也可以使用其他语言,你并不局限于 c 和 c++。 如果你想使用其他语言,你需要安装社区制作的绑定。 它们可以在 官方文档页面 中找到。

如果你拥有 Godot 的 mono 版本,你就可以编写 C# 代码。 你可以使用它为你的游戏创建高速代码以制作模块或对象。 它也可以用于编写工具。

信息

注意:Godot 本身是用 C++ 编写的,直接进行修改需要你重新编译 Godot 的编辑器。 许多 Godot 用户使用这种方法创建了具有自定义工具的自定义 Godot 编辑器。

我如何使用这些?

[编辑 | 编辑源代码]

GDScript、VisualScript 和 GDExtension(或 NativeScript)都可以附加到一个节点,或用于创建一个自定义节点。 在 Godot 的 mono 版本中,C# 也可以被附加。 C++ 只能用于 Godot 的现有引擎中。 为此,你需要下载一个没有被编译成应用程序文件的特殊版本的 Godot。

要将脚本附加到一个节点,你首先需要一个节点来附加它! 假设你阅读了上一章(“什么是节点”),你可以从上次开始的项目开始。

打开 Godot,并通过双击屏幕中央菜单中的项目来打开你的测试项目。 如果 “Test UI.tscn” 还没有打开,请从文件系统坞站中打开它。 选择你的 Test UI Control 节点。 在场景坞站的顶部有一个看起来像纸张,两侧边缘卷起来的按钮。 按下它。

单击“模板”按钮,并从出现的下拉菜单中选择“空”。 按下创建。 现在应该出现一个新屏幕,屏幕中央有一个文本编辑区域,Test UI 节点应该有一个纸张图标。 任何时候你想重新打开此处的脚本,都可以点击它。 现在脚本看起来很无聊

extends Control

然而,这非常重要! extends 关键字(非常重要的代码片段,如 pass)告诉 Godot 你的脚本继承了你放置在这里的节点类型。 你只能将脚本附加到该类型的节点,或者继承该类型的节点。

extends Control 下面,写入以下代码

func _ready() -> void:
  print("Hello world!")

func 告诉 Godot 你想定义一个函数。 如果你经常使用 Python,你可能会认为 print 从未被调用,因为它在函数内部,而函数从未被自动调用。 内置函数 _ready() 告诉 Godot 在具有该脚本的节点“准备就绪”时运行代码,或者说它已完全加载。

_init() 在节点准备就绪之前运行。 使用它执行自包含的预构造操作。 _process(delta) 以尽可能快的速度在每一帧运行。 delta 是函数的参数。 它代表自上一帧以来的秒数。 当游戏出现延迟时,该值会上升。 _physics_process(delta)_process 类似,它在固定时间步长上以每秒 60 帧的速度运行。 _exit_tree() 在节点退出场景(成为孤儿或被“释放”或删除)或游戏关闭时运行。

现在,让我们使用一些更复杂的代码。 此程序将记录游戏运行以来的秒数,并在游戏结束时显示它。

var time: float = 0 # Or just "var time = .0"

# The "-> void" is optional

func _process(delta):
  # This increments time
  time += delta

func _exit_tree():
  print("Time passed: ",time)

现在,让我们更新它,使其在随机时间后自动关闭游戏。

_process 之前添加此代码

const MAX_TIME = 10

const MIN_TIME = 5
onready var time_to_quit=randi() % (MAX_TIME-MIN_TIME) + MIN_TIME + 1

这将在调用 _ready 时自动创建一个变量并设置它。 time_to_quit 是 5 到 10 之间的随机数。 在 _process 函数添加此代码

if time >= time_to_quit:
  # Quit after a random amount of time.
  get_tree().quit()

一个问题... 数字从未改变。为什么?因为你需要先调用 randomize()

time_to_quit 的声明更改为 var time_to_quit,并在 _ready 函数中添加以下内容

randomize()
time_to_quit = randi()% (MAX_TIME-MIN_TIME) + MIN_TIME + 1

+ 1 是必要的,因为 randi()%X 返回一个介于 0{{Gdscript/string|X-1)) 之间的随机数。

这将创建一个介于 0 和 MAX_TIME 减去 MIN_TIME 减去 1 之间的数字。添加 MIN_TIME 和额外的 1 会得到您需要的结果,即 MIN_TIMEMAX_TIME 之间的随机数。

randomize() 使 randi() 提供不同的随机数流。随机化基于时间,并且出于性能原因不应该 每帧调用一次。每个节点一次,在 _ready 调用期间调用就足够了。

您学到了什么

[编辑 | 编辑源代码]
  1. 目前支持的 3 种(Godot 3.x 版本为 4 种)脚本类型
  2. 如何将脚本附加到节点
  3. 如何使用 delta 记录时间
  4. 如何关闭游戏
  5. 如何生成随机数。

另请参见

[编辑 | 编辑源代码]

Godot 文档 -> 脚本


1 NativeScript 是引擎使用的代码,需要重新编译引擎才能使用。

正确
错误

2 Godot 4 中停用了哪种语言?

视觉脚本
GDScript
C++
C#
Python

3 GDScript 基于哪些其他流行的编程语言?

4 哪些函数使用delta 作为参数?

_process
_physics_process
_ready
_exit_tree

5 这些过程中的哪一个以固定的时间步长执行?

_process
_physics_process
_second_process

6 "delta" 这个词也是一个关键字:

正确
错误


参考文献

[编辑 | 编辑源代码]

Godot 游戏引擎指南

入门 [编辑]
安装
什么是节点?
编程
资源和导入
信号和方法
你的第一个游戏
使其正常工作
调试
输入
物理
保存和加载
多人游戏
使其看起来不错
UI 皮肤
动画
高级帮助
服务器(单例)
平台特定
优化
加密
导出
插件
其他
有用链接
作者和贡献者
印刷版


<-- 上一页 返回顶部 下一页 -->


华夏公益教科书