GDScript 基础 您所在的位置:网站首页 易方达中证银行指数基金怎么样 GDScript 基础

GDScript 基础

2023-08-12 19:19| 来源: 网络整理| 查看: 265

数据¶ 变量¶

变量可以作为类成员存在,也可以作为函数的局部变量存在。它们是用 var 关键字创建的,并且可以在初始化时指定一个值。

var a # Data type is 'null' by default. var b = 5 var c = 3.8 var d = b + c # Variables are always initialized in order.

变量可以选择具有类型声明. 指定类型时, 变量将强制始终具有相同的类型, 并且试图分配不兼容的值将引发错误.

类型在变量声明中使用 :(冒号)符号在变量名后面指定,后面是类型。

var my_vector2: Vector2 var my_node: Node = Sprite.new()

如果在声明中初始化变量,则可以推断类型,因此可以省略类型名称:

var my_vector2 := Vector2() # 'my_vector2' is of type 'Vector2'. var my_node := Sprite.new() # 'my_node' is of type 'Sprite'.

类型推断只有在指定的值具有定义的类型时才可能, 否则将引发错误.

有效的类型有:

内置类型(Array, Vector2, int, String, 等).

引擎类(Node, Resource, Reference, 等).

常量名, 如果它们包含脚本资源(MyScript 如果声明 const MyScript = preload("res://my_script.gd")).

在同一个脚本中的其他类, 遵循作用域(如果在相同作用域内, 在 class InnerClass 中声明 class NestedClass 得到 InnerClass.NestedClass ).

脚本类使用 class_name 关键字声明.

转换¶

分配给类型变量的值必须具有兼容的类型. 如果需要将值强制转换为特定类型, 特别是对于对象类型, 则可以使用强制转换运算符 as.

如果值是相同类型或转换类型的子类型, 则在对象类型之间进行转换会导致相同的对象.

var my_node2D: Node2D my_node2D = $Sprite as Node2D # Works since Sprite is a subtype of Node2D.

如果该值不是子类型, 则强制转换操作将产生 null 值.

var my_node2D: Node2D my_node2D = $Button as Node2D # Results in 'null' since a Button is not a subtype of Node2D.

对于内置类型, 如果可能, 将对其进行强制转换, 否则引擎将引发错误.

var my_int: int my_int = "123" as int # The string can be converted to int. my_int = Vector2() as int # A Vector2 can't be converted to int, this will cause an error.

与场景树进行交互时,强制转换对于获得更好的类型安全变量也很有用:

# Will infer the variable to be of type Sprite. var my_sprite := $Character as Sprite # Will fail if $AnimPlayer is not an AnimationPlayer, even if it has the method 'play()'. ($AnimPlayer as AnimationPlayer).play("walk") 常量¶

常量代表游戏运行时不可更改的值. 其值在编译时必须已知. 使用 const 关键字即可为常量值赋予名称. 尝试为常量重写赋值会引发错误.

我们建议使用常量来储存不应当更改的值.

const A = 5 const B = Vector2(20, 20) const C = 10 + 20 # Constant expression. const D = Vector2(20, 30).x # Constant expression: 20. const E = [1, 2, 3, 4][0] # Constant expression: 1. const F = sin(20) # 'sin()' can be used in constant expressions. const G = x + 20 # Invalid; this is not a constant expression! const H = A + 20 # Constant expression: 25 (`A` is a constant).

尽管可以从分配的值中推断出常量的类型,但是也可以添加显式的类型说明:

const A: int = 5 const B: Vector2 = Vector2()

分配不兼容类型的值将引发错误.

备注

由于数组和字典是通过引用的方式传递,常数是 "浅的"。这代表,如果你声明了一个常数数组或字典类型的变量名,依然可以增删数组或字典内部元素,但你不能将常数变量名重新赋予一个新的数组或字典。

枚举¶

枚举基本上是常量的简写, 如果你想为某些常量分配连续整数, 那么枚举非常有用.

如果将名称传递给枚举, 它将把所有键放入该名称的常量字典中.

重要

从 Godot 3.1 开始, 不会再将具名枚举的键注册为全局常量, 应该通过前缀枚举的名字的形式来访问(Name.KEY);见后面的例子.

enum {TILE_BRICK, TILE_FLOOR, TILE_SPIKE, TILE_TELEPORT} # Is the same as: const TILE_BRICK = 0 const TILE_FLOOR = 1 const TILE_SPIKE = 2 const TILE_TELEPORT = 3 enum State {STATE_IDLE, STATE_JUMP = 5, STATE_SHOOT} # Is the same as: const State = {STATE_IDLE = 0, STATE_JUMP = 5, STATE_SHOOT = 6} # Access values with State.STATE_IDLE, etc. 函数¶

函数总是属于一个 类 . 变量查找的作用域的优先级是:局部 → 类成员 → 全局. self 变量总是可用的, 并作为访问类成员的选项提供, 但并不总是必需的(与Python不同, 不 应该将其作为函数的第一个参数传递).

func my_function(a, b): print(a) print(b) return a + b # Return is optional; without it 'null' is returned.

函数可以在任何时候 return . 默认返回值是 null.

函数也可以具有参数和返回值的类型声明。可以使用与变量类似的方式添加参数的类型:

func my_function(a: int, b: String): pass

如果函数参数具有默认值,则可以推断类型:

func my_function(int_arg := 42, String_arg := "string"): pass

可以在参数列表之后使用箭头标记(->)指定函数的返回类型:

func my_int_function() -> int: return 0

有返回类型的函数 必须 返回正确的值. 将类型设置为 void 意味着函数不返回任何内容.Void函数可以使用 return 关键字提前返回, 但不能返回任何值.

func void_function() -> void: return # Can't return a value

备注

非void函数必须 总是 返回一个值, 所以如果您的代码有分支语句(例如 if/else 构造), 那么所有可能的路径都必须返回一个值. 例如, 如果在 if 块中有一个 return , 但在 if 块之后没有, 编辑器就会抛出一个错误, 因为如果没有执行这个块, 该函数将没有有效值返回.

引用函数¶

与Python相反, 函数 不是 GDScript中的第一类对象. 这意味着它们不能存储在变量中, 不能作为参数传递给另一个函数, 也不能从其他函数返回. 这是出于性能原因.

若要在运行时按名称引用一个函数(例如将其存储在一个变量中,或将其作为参数传递给另一个函数),必须使用 call 或 funcref 帮助函数:

# Call a function by name in one step. my_node.call("my_function", args) # Store a function reference. var my_func = funcref(my_node, "my_function") # Call stored function reference. my_func.call_func(args) 静态函数¶

函数可以声明为静态的。当一个函数是静态的,它不能访问实例成员变量或 self。这对于创建辅助函数库非常有用:

static func sum2(a, b): return a + b 语句和控制流程¶

语句是标准的, 可以是赋值, 函数调用, 控制流结构等(见下面). ; 作为语句分隔符是完全可选的.

if/else/elif¶

简单的条件是通过使用 if/else/elif 语法创建的. 条件的括号是允许的, 但不是必需的. 考虑到基于制表符的缩进的性质, 可以使用 elif 而不是 else/if 来维持缩进的级别.

if [expression]: statement(s) elif [expression]: statement(s) else: statement(s)

短语句可以写在与条件相同的行上:

if 1 + 1 == 2: return 2 + 2 else: var x = 3 + 3 return x

有时您可能希望基于布尔表达式分配不同的初始值。在这种情况下,三元表达式将派上用场:

var x = [value] if [expression] else [value] y += 3 if y new_value: progress_bar.modulate = Color.red else: progress_bar.modulate = Color.green # Imagine that `animate` is a user-defined function that animates the # bar filling up or emptying itself. progress_bar.animate(old_value, new_value) ...

备注

要使用信号,您的类必须扩展 Object 类或任何扩展它的类型,例如 Node、KinematicBody、Control…

在 Game 节点中,我们同时获得 Character 和 Lifebar 节点,然后将发出信号的 Character 连接到接收器,在本例中为 Lifebar 节点。

# Game.gd func _ready(): var character_node = get_node('Character') var lifebar_node = get_node('UserInterface/Lifebar') character_node.connect("health_changed", lifebar_node, "_on_Character_health_changed")

这样 Lifebar 就能够对健康值做出反应,无需将其耦合到 Character 节点。

您可以在信号的定义后的括号中写上可选的参数名称:

# Defining a signal that forwards two arguments. signal health_changed(old_value, new_value)

这些参数显示在编辑器的节点停靠面板中,Godot可以使用它们为您生成回调函数. 但是, 发出信号时仍然可以发出任意数量的参数;由您来发出正确的值.

GDScript可以将值数组绑定到信号和方法之间的连接. 发出信号时, 回调方法将接收绑定值. 这些绑定参数对于每个连接都是唯一的, 并且值将保持不变.

如果发出的信号本身不能使您访问所需的所有数据, 则可以使用此值数组将额外的常量信息添加到连接.

以上面的示例为基础,假设我们要在屏幕上显示每个角色遭受伤害的日志,例如 Player1 遭受了 22 伤害。。health_changed 信号没有给我们提供受到伤害的角色的名称。因此,当我们将信号连接到游戏终端中时,可以在绑定数组参数中添加角色的名称:

# Game.gd func _ready(): var character_node = get_node('Character') var battle_log_node = get_node('UserInterface/BattleLog') character_node.connect("health_changed", battle_log_node, "_on_Character_health_changed", [character_node.name])

我们的 BattleLog 节点接收绑定数组中的每个元素作为一个额外的参数:

# BattleLog.gd func _on_Character_health_changed(old_value, new_value, character_name): if not new_value


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有