Godot 游戏引擎关键字指南 (3.x)
- 关键字
Godot 中的关键字是 GDScript 中使用的特殊词语。不幸的是,其中一些词语在 Godot 的类文档中没有详细记录。
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 {
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 语句 中。如果其前面的值 在 其后面的值 内部,它将评估为真。它可以检查
- 如果一个值在数组中
- 如果一个键在字典中
- 如果一段文本包含另一段文本
- 如果一个对象包含一个具有相同名称的属性或常量
以及其他事物。"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 Dir 和 Config/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
[edit | edit source]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
有关更多信息,请参阅 puppet 和 master。使用 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
[edit | edit source]tool 关键字告诉 Godot 脚本在编辑器中运行。这类脚本通常被称为工具脚本。如果脚本仅在脚本编辑屏幕中打开,则它不会运行。它必须附加到场景中的节点,或者具有脚本的节点必须在编辑器中。
它必须始终放在extends关键字之前。
如果您有一个工具脚本,它继承的脚本和继承它的脚本将不会运行,除非它们也是工具脚本。所有节点本身都在编辑器中运行,但只有在使用编辑器插件将其放置到其界面中时才会运行。
var
[edit | edit source]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)