天下程序员首页cx06.com
管理 |  登录 |  注册
袁鹏飞的小屋
笔记(共39个) > godot学习

godot4的信号连接说明(全网最全的godot4信号连接)

阅读 1赞 0回复 2024-07-13 00:44:22
导航目录:共(8)个目录

  godot4中一个很重要的东西就是信号,信号就是,这边发送信号,那边响应。

 看官方说明:

信号的官方说明

 Error connect(signal: StringName, callable: Callable, flags: int = 0)

按名称将 signal 连接到 callable。还可以添加可选的 flags 来配置该连接的行为(请参阅 ConnectFlags 常量)。

一个信号只能连接到同一个 Callable 一次。如果该信号已经连接,除非该信号是使用 CONNECT_REFERENCE_COUNTED 连接的,否则该方法会返回 ERR_INVALID_PARAMETER 并推送一条错误消息。为防止这种情况,请首先使用 is_connected() 检查已存在的连接。

如果 callable 的对象被释放,则该连接将会丢失

然后再看官方案例

官方推荐的写法:

     推荐写法1:

          直接用信号.connect

             推荐案例:

               hit.connect

更小的案例

还有5级案例
再个6级案例

连接信号是 Godot 中最常见的操作之一,API 提供了许多这样做的选项,这些选项将在下面进一步介绍。下面的代码块显示了推荐的方法。

一个信号只能连接到同一个 Callable 一次。如果该信号已经连接,除非该信号是使用 CONNECT_REFERENCE_COUNTED 连接的,否则该方法会返回 ERR_INVALID_PARAMETER 并推送一条错误消息。为防止这种情况,请首先使用 is_connected() 检查已存在的连接。

如果 callable 的对象被释放,则该连接将会丢失。

推荐语法的示例:

连接信号是 Godot 中最常见的操作之一,API 提供了许多这样做的选项,这些选项将在下面进一步介绍。下面的代码块显示了推荐的方法。

func _ready():
    var button = Button.new()
    # 这里的 `button_down` 是一个 Signal 变体类型,因此我们调用 Signal.connect() 方法,而不是 Object.connect()。
    # 请参阅下面的讨论以更深入地了解该 API。
    button.button_down.connect(_on_button_down)

    # 这假设存在一个“Player”类,它定义了一个“hit”信号。
    var player = Player.new()
    # 我们再次使用 Signal.connect() ,并且我们还使用了 Callable.bind() 方法,
    # 它返回一个带有参数绑定的新 Callable。
    player.hit.connect(_on_player_hit.bind("剑", 100))

func _on_button_down():
    print("按钮按下!")

func _on_player_hit(weapon_type, damage):
    print("用武器 %s 击中,造成 %d 伤害。" % [weapon_type, damage])

看到这里,有人要疑惑了,

Object.connect() 还是 Signal.connect()?

如上所示,推荐的连接信号的方法不是 Object.connect()。下面的代码块显示了连接信号的四个选项,使用该传统方法或推荐的 Signal.connect(),并使用一个隐式的 Callable 或手动定义的 Callable。

这段话,通俗的解释::

信号.connect(方法) 或者 信号.connect(方法.bind())

 而信号== Object.hit/button_down  等等,看到这里明白了吧

 下面是不推荐的写法: 大家可以对比下。

结论:带callable的很明显不占优势

func _ready():
    var button = Button.new()
    # 选项 1:Object.connect() 并使用已定义的函数的隐式 Callable。
    button.connect("button_down", _on_button_down)
    # 选项 2:Object.connect() 并使用由目标对象和方法名称构造的 Callable。
    button.connect("button_down", Callable(self, "_on_button_down"))
    # 选项 3:Signal.connect() 并使用已定义的函数的隐式 Callable。
    button.button_down.connect(_on_button_down)
    # 选项 4:Signal.connect() 并使用由目标对象和方法名称构造的 Callable。
    button.button_down.connect(Callable(self, "_on_button_down"))

func _on_button_down():
    print("按钮按下!")

说完了信号,下面说下信号的触发emit_signal()

信号的触发以及绑定和传递参数综合案例:

绑定和传递参数:

绑定参数的语法是通过 Callable.bind(),它返回一个绑定了参数的 Callable 的副本。

当调用 emit_signal() 时,信号参数也可以被传递。下面的示例显示了这些信号参数和绑定参数之间的关系。

func _ready():
    # 这假设存在一个 `Player` 类,它定义了一个 `hit` 信号。
    var player = Player.new()
    # 使用 Callable.bind()。
    player.hit.connect(_on_player_hit.bind("剑", 100))

    # 发出信号时添加的参数首先被传递。
    player.emit_signal("hit", "黑暗领主", 5)

# 我们在发出时传递两个参数(`hit_by`,`level`),
# 并在连接时再绑定两个参数(`weapon_type`、`damage`)。
func _on_player_hit(hit_by, level, weapon_type, damage):
    print("被 %s(等级 %d)用武器 %s 击中,造成 %d 伤害。" % [hit_by, level, weapon_type, damage])



赞(1)

文章作者置顶的回复

全部回复列表 当前第(1)页

添加回复,文明发言,会审核.(服务区回复可以发广告)

作者最新笔记
天下程序员 www.cx06.com 程序员的网上家园!
作者微信:13126507001