Godot 游戏引擎指南/关键词
- 关键词
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 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 语句 中使用。如果它前面的值在它后面的值内部,则它评估为真。它可以检查
- 如果某个值在数组中
- 如果某个键在字典中
- 如果一段文本包含另一段文本
- 如果某个对象包含具有相同名称的属性或常量
以及其他一些东西。"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>。
如果您在运行时使用 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
[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 关键字是五个多玩家关键字之一。在 "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。
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
[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