Loading... ## Signal 基本使用 信号符合编程设计模式中的观察者模式。对此原理不做赘述。 发信号节点的示例脚本 ```GDscript 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) ``` 接受信号节点的示例脚本 主要由两部分构成,一是连接函数,二是接收方法。 如果采用编辑器中连接,则该脚本中可见的只有接收方法 ```GDscript 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)。一个节点可以根据需要添加到任意多个编组。这是组织大型场景的一个有用特性。有两种方法可以向编组中添加节点。 1. 使用编辑器添加 使用节点面板下的`Groups`按钮 ![](https://s1.ax1x.com/2020/04/06/GsqEcR.png) 2. 使用代码中添加 ```GDscript func _ready(): add_to_group("enemies") ``` ### 使用场景 #### 用于批量调用编组中节点的方法 ```GDscript func _on_discovered(): # 当发现玩家后,通知enemies组的所有节点,执行player_was_discovered()方法。 get_tree().call_group("enemies", "player_was_discovered") ``` #### 用于批量连接信号 现在考虑这样一种情况:一个主场景中有多个相同的子场景实例,子场景需要向主场景发送信号。主场景接收信号并执行接收函数。 这样,我们的朴素手法就是在编辑器中,将每个子场景手动与主场景相连接。 在这种情况下,如果子场景数目太多又该怎么办?如果子场景数目是不定的又怎么办? 答案是使用编组。 主场景示例脚本 ```GDscript 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 ``` 最后修改:2020 年 04 月 06 日 03 : 42 PM © 允许规范转载