信号

Godot 提供了一种通过使用信号将消息从一个对象发送到另一个对象的方法。
要创建信号,您需要创建一个观察者类和一个主题类。
主题类向观察者类发出信号。相反,观察者类一旦收到来自主题类的呼叫/信号,就会执行一个动作。
从某种意义上说,主题类应该发出信号;观察者需要订阅主题。
主题类和发射器类都必须存在于场景树上。这意味着这两个类都需要是场景树上的一个节点。
image.png
要创建主题类,请使用signal关键字。
signal
要将信号发送到可观察对象,您需要调用该emit_signal方法。
如果您想将数据传递给可观察对象,则发出的信号具有一个强制参数和一个可选参数。
emit_signal(, )
要创建 observable,需要在场景树上创建 Node 的变量实例,然后调用信号connect方法。
connect如果您想将数据传递给可观察对象,该方法接受 3 个强制参数和附加的可选参数。
connect(, , )
我们来看一个完整的例子:

  1. # Subect Class
  2. # Name in Scene: Player
  3. # node Type: Sprite
  4. extends Sprite
  5. signal healthChanged # create the signal called healthChanged
  6. var check: int = 0
  7. var playerHealth: int = 100
  8. func _process(deltaTime):
  9. if check < 1:
  10. check = check + 1
  11. changeHealth(-100)
  12. func changeHealth(value):
  13. playerHealth = playerHealth + value
  14. emit_signal("healthChanged", playerHealth) # Emit the signal to observables

在这个例子中,我们在场景树上有一个名为 的节点Player,我们想创建一个信号,每次玩家的生命值发生变化时都会发出信号。
最重要的是,我们将玩家当前的健康值传递给 observables。
在这种情况下,我们想知道被调用的方法何时changeHealth(value)被调用。
播放器节点被认为是主题类。

  1. # Oberver Class
  2. # Name in Scene: Health
  3. # node Type: Node2D
  4. extends Node2D
  5. onready var PlayerNode = get_node('Player')
  6. func _ready():
  7. PlayerNode.connect("healthChanged", self, "doSomething") # Connect to signal
  8. func doSomething(playerHealth):
  9. print('We changed value of health to: ', playerHealth)

上面的脚本附加到名为Health.
您使用 为 Player 节点创建一个实例onready var PlayerNode = get_node(‘Player’)。
然后你用 连接到它的信号PlayerNode.connect(“healthChanged”, self, “doSomething”)。