跳转至内容

Godot 游戏引擎指南/关键词

100% developed
来自维基教科书,开放世界开放书籍
注意

此页面适用于 Godot 4.x。对于 Godot 3.x 版本,请参阅存档页面
关键词

Godot 中的关键词是 GDScript 中使用的特殊单词。不幸的是,其中一些在 Godot 的类文档中没有详细记录。

await 关键字将等待传递的信号被发出。

print(1)
# Creates a 1 second timer
await get_tree().create_timer(1).timeout
print(2)

break 关键字结束一段循环代码。对于“永远”循环很有用

var counter = 0

while true:
  counter += 1
  if counter == 15:
    break

这将在代码运行 15 次后结束循环。

continue 关键字在循环内部使用。类似于 break,continue 跳过循环中的单个运行。就像中断它一样,但它不是结束整个循环,而是只跳过单个迭代。

for num in range( 1,5 ):
  if num == 4:
    continue
  print( num )

以上运行 5 次。Num 是 1、2、3、4 然后 5。如果 Num 是 4,它“继续”循环。否则它会打印。所以 4 没有被打印,但 1、2、3 和 5 被打印了。

const 关键字可以在 var 的位置使用来创建一个常量,一个不能更改的值。

与变量不同,常量可以在 静态函数 中使用。

enum 关键字类似于制作 整数 常量

enum DrawMode ={
  PEN,
  FILL,
  ERASER,
  LINE,
  BOX,
  SHADING,
  CONTRAST,
  BLEND
}

上面的代码是我曾经在 Godot 中制作的图像编辑器中的代码片段。它显示了可能的绘制模式,例如线和填充,作为命名的整数,以便更轻松地调试代码。

不要与导出混淆。@export 关键字是一个非常强大的关键字。

它允许在 Inspector 面板中编辑值,并且它会按实例保存更改。

对于基本的,尝试 @export var max_health:int

您甚至可以使用模板和范围

# This allows a range of 0 to 100 with a step of 2
@export_range( 0, 100, 2 ) var number := 50

# This allows linking a file path
@export_file() var file_path :String

# This asks for a file path that ends with ".json" or ".md"
@export_file(".json", ".md" ) var specific_extension_file_path :String

# You can also try "String" with this one
@export_enum( Number1, Number2, Number3 ) var dropdown_menu_int := 0

# This creates a slider to change the float with a step of 0.0001
@export ( 0, 1, 0.0001 ) var float_with_range := 0.5

extends 关键字告诉 Godot 脚本继承了给定对象的属性。

它必须位于脚本的最顶部。只有 tool 可以放在它之前。

for 关键字在给定值的每个项目之后运行它后面的缩进代码块。

for i in ["Hello", "I", "am", "human", 1, 2, 3]:
  print( i )

通常在 if 语句 中使用。如果它前面的值在它后面的值内部,则它评估为真。它可以检查

  1. 如果某个值在数组中
  2. 如果某个键在字典中
  3. 如果一段文本包含另一段文本
  4. 如果某个对象包含具有相同名称的属性或常量

以及其他一些东西。"h" in "Hello" 将为假。“Hello” 中没有小写“h”。如果您希望进行不区分大小写的搜索,请在两个值上调用 to_lower() 以将每个字母转换为小写(或 to_upper() 以转换为大写 - 全部大写)。

通常在 if 语句中使用。它检查它前面的值是否为它后面的类型。

print( "Hello" is String ) # True
print( 52434 is int ) # True
print( bool( "52434" ) is bool ) # True
print( load( "res://icon.png" ) is StreamTexture ) # True
print( load( "res://icon.png" ) is Texture ) # True

好吧,load 在技术上是在全局作用域中描述的。但是,它被定义为一个关键字,所以如果它不在此处就没有意义。

它在被调用时从您的文件系统加载文件。它接受一个参数:一个文件路径。

文件路径必须相对于您的项目文件夹或玩家保存文件夹,并且不能指向外部

有效示例

load( "res://assets/weapons/sword.png" )
load( "res://entities/chicken_egg.tscn" )
load( "user://custom_entities/mutant_monster.tscn" )

res 指向您的项目文件夹。user 指向玩家的保存文件夹。这通常是%appdata%/roaming/godot/app_userdata/<project_name>,除非 ProjectSetting Config/Use Custom User DirConfig/Custom User Dir Name 设置,在这种情况下,它是%appdata%/roaming/<ProjectSettings:Config/Custom User Dir Name>

注意

如果您在运行时使用 load 来加载文件,您需要将 ProjectSettings.editor/export/convert_text_resources_to_binary 设置为 false,否则文件可能无法在导出的构建中按预期加载。

master 关键字是 5 个多人游戏关键字系列的一部分。如果使用它,它将使只有“master”调用函数。

remote master func take_damage( damage ):
  health -= damage
  rpc( "set_health", health )

您不希望在 puppet 上调用它,以帮助防止错误。

@onready

[edit | edit source]

@onready 关键字位于 var 关键字之前。它允许使用动态数字或通过节点路径获取节点,并且在 _ready() 函数调用之前设置。

@onready var sword_node = $hand/sword

pass 关键字用作空白代码行。在 "if" 语句或 "for" 语句之后或在函数声明之后使用它,以作为 "代码块"(以消除错误),而无需执行任何操作。这被称为 "空" if 语句或 "存根函数"。

if true:
    pass

preload

[edit | edit source]

参见 load。该文件可以相对于调用它的脚本或 "res"。脚本加载时资源就会加载,防止游戏运行时出现停顿。但是,文件 **必须** 存在,否则会报错,并且路径 **必须** 是常量(即:不可改变)。

res://game/game.gd

preload( "entities/thing.tscn" )

preload( "res://game/entities/thing.tscn" )

puppet

[edit | edit source]

puppet 关键字是五个多玩家关键字之一。在 "func" 之前但 "remote" 之后使用它。它使函数仅调用 非主控方

remote puppet func set_health( v ):
  health = v

为了防止玩家作弊,你不会想将其调用到 主控方

remote

[edit | edit source]

在 "func" 关键字之前使用 remote 关键字,允许在调用 "rpc"、"rpc_id"、"rpc_unreliable" 或 "rpc_unreliable_id" 时,该函数在多玩家模式下被其他对等节点远程调用。小心作弊和安全威胁!

func hit( ):
  health -= 1
  rpc( "player_hit", health )

remote func player_hit( hp ):
  if get_tree().get_rpc_sender_id( ) != get_network_master( ):
    return # This means a player is trying to cheat
  health = hp

参见 puppetmaster 了解更多信息。使用 remotesync 在本地以及通过网络调用函数。

警告:如果你没有添加检查来阻止恶意攻击者,恶意黑客可以使用你的游戏来检索或删除数据,或者玩家可以作弊。除非你知道自己在做什么,否则永远不要将 remote 添加到删除或创建文件的函数中。

remotesync

[edit | edit source]

参见 remote。此关键字还会在本地调用函数,而不是只通过网络调用它们。非常适合告诉其他对等节点以及主控方角色已经跳跃。

return

[edit | edit source]

return 关键字用于结束函数。对于被调用并 "返回" 值的函数,return 关键字是目标位置。

func get_some_value( ):
  return "some string"

它还结束函数调用,因此可以在 if 语句中使用它来跳过函数的其余部分。它不需要返回值,默认情况下返回 null


static

[edit | edit source]

通常,要调用对象的函数,你需要它的实例。如果在 "func" 关键字之前使用 static 关键字,你将能够从非实例中调用它。但是,你只能使用其他静态函数或全局范围内的函数。你不能使用成员 变量

在下面的例子中,Weapon 是一个自定义的 Resource

Weapon.gd
extends Resource
class_name Weapon

export var damage = 5
const DAMAGE = 5

static func get_damage( ):
  # Cannot use an outside variable here
  return DAMAGE # Can use a constant though

Weapon.new( ).get_damage( ) 变成了 Weapon.get_damage( ),如果要查找值,可以节省内存和 CPU 资源。

@tool

[edit | edit source]

@tool 关键字告诉 Godot 脚本在编辑器中运行。这类脚本通常被称为工具脚本。如果脚本只在脚本编辑屏幕中打开,它将不会运行。它必须附加到场景中的节点,或者具有该脚本的节点必须在编辑器中。

它必须始终放置在 extends 关键字之前。如果觉得方便,可以将其放置在与 extends 相同的代码行上。

如果你有一个工具脚本,它继承的脚本以及继承它的脚本将不会运行,除非它们也是工具脚本。所有节点本身都在编辑器中运行,但前提是它们被放置到带有编辑器插件的界面中。

另请参见:编辑器插件(以及 插件章节),非常强大的功能。

var 关键字创建变量。当它们离开作用域时,它们会自动从内存中释放(例如,缩进的代码块取消缩进)。

var global_varible := 1

func _ready():
  some_function(7)
 
func some_function(argument):
  print(argument)
  print(global_variable)
  var temporary_variable = 2
  print(temporary_variable)
  if true:
    var another_variable = 3
    print(another_variable)
    print(temporary_variable)
  print(another_variable) # Error: the identifier "another_variable" isn't declared in the current scope, since it is not declared in an lower indentation.

while

[edit | edit source]

while 关键字在它之后的 if 语句不再为真之前,运行它之后缩进的代码块。如果它一开始是假的,它将不会运行。

var i = 0
while i < 50:
  print(i)
  i += 1




华夏公益教科书