跳转至内容

Godot 游戏引擎关键字指南 (3.x)

100% developed
来自 Wikibooks,开放世界中的开放书籍
注意

此页面适用于 Godot 3.x。有关 Godot 4.x 的相同页面,请参阅 更新后的页面
关键字

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

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

var counter = 0

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

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

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

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 {
  DRAW_MODE_PEN,
  DRAW_MODE_FILL,
  DRAW_MODE_ERASER,
  DRAW_MODE_LINE,
  DRAW_MODE_BOX,
  DRAW_MODE_SHADING,
  DRAW_MODE_CONTRAST,
  DRAW_MODE_BLEND
}

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

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

它允许在 Inspector 窗口中编辑值,并且它为每个实例保存更改。

对于基本示例,请尝试 export var max_health:int

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

# This allows a range of 0 to 100 with a step of 2
export ( int, 0, 100, 2 ) var number = 50

# This allows linking a file path
export ( String, FILE ) var file_path

# This asks for a file path that ends with ".json" or ".md"
export ( String, FILE, ".json;Json file, .md;Mark Down file" ) var specific_extension_file_path

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

# This creates a slider to change the float with a step of 0.0001
export ( float, 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>

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

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

你不应该在 傀儡 上调用它,以帮助防止错误。

onready

[edit | edit source]

onready 关键字放在 var 关键字之前。它允许使用在 _ready() 函数调用之前设置的动态数字。

onready var random_number = randi( )

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 关键字是 5 个多玩家关键字中的一个。在 "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

setget

[edit | edit source]

变量 声明的末尾使用。语法:var points = 0 setget set_points get_points。getter 是可选的。setter 必须有一个参数(要设置的值),而 getter 必须返回一个值。例如

export var points = 0 setget set_points get_points

func set_points( value ):
  points = value

func get_points( ):
  return points

static

[edit | edit source]

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

在以下示例中,Weapon 是一个自定义的 资源

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 关键字告诉 Godot 脚本在编辑器中运行。这类脚本通常被称为工具脚本。如果脚本仅在脚本编辑屏幕中打开,则它不会运行。它必须附加到场景中的节点,或者具有脚本的节点必须在编辑器中。

它必须始终放在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

yield

[edit | edit source]

目前,yield 接受 2 个参数:一个对象和一个信号名称(作为字符串)。调用它将等待,直到从该对象调用该信号。

print(1)
# Creates a 1 second timer
yield(get_tree().create_timer(1), "timeout")
print(2)




华夏公益教科书