Signal 基本使用
信号符合编程设计模式中的观察者模式。对此原理不做赘述。
发信号节点的示例脚本
extends Node2D
signal my_signal
signal my_signal_with_value(value_1,value_2)
var a = 666
var b = "oh"
func _ready():
emit_signal("my_signal")
emit_signal("my_signal_with_value",a,b)
接受信号节点的示例脚本
主要由两部分构成,一是连接函数,二是接收方法。
如果采用编辑器中连接,则该脚本中可见的只有接收方法
func _ready():
# $发信号节点.connect("信号名",self,"接收函数")
$child_node.connect("my_signal",self,"do_something")
$child_node.connect("my_signal",self,"do_something2")
func do_something():
print("have fun!")
func do_something2(a : int, b : String):
print(b,",",a)
Group 编组
简介
Godot中的编组的工作方式类似于其他软件中的标记(Tag)。一个节点可以根据需要添加到任意多个编组。这是组织大型场景的一个有用特性。有两种方法可以向编组中添加节点。
- 使用编辑器添加
使用节点面板下的Groups
按钮 - 使用代码中添加
func _ready():
add_to_group("enemies")
使用场景
用于批量调用编组中节点的方法
func _on_discovered():
# 当发现玩家后,通知enemies组的所有节点,执行player_was_discovered()方法。
get_tree().call_group("enemies", "player_was_discovered")
用于批量连接信号
现在考虑这样一种情况:一个主场景中有多个相同的子场景实例,子场景需要向主场景发送信号。主场景接收信号并执行接收函数。
这样,我们的朴素手法就是在编辑器中,将每个子场景手动与主场景相连接。
在这种情况下,如果子场景数目太多又该怎么办?如果子场景数目是不定的又怎么办?
答案是使用编组。
主场景示例脚本
var death = 0
func _ready():
# 每个子场景示例enemy 与主场景进行信号连接。死亡后向主场景发送信号。
var enemies = get_tree().get_nodes_in_group("enemies")
for node in enemies:
node.connect("died",self,"death_statistics")
func death_statistics():
death += 1