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)。一个节点可以根据需要添加到任意多个编组。这是组织大型场景的一个有用特性。有两种方法可以向编组中添加节点。

  1. 使用编辑器添加
    使用节点面板下的Groups按钮
  2. 使用代码中添加
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
最后修改:2020 年 04 月 06 日
如果觉得我的文章对你有用,请随意赞赏