Godot 4.1 信号无法在两个不同脚本中连接的问题

问题描述 投票:0回答:1

我遇到了信号问题,我试图让我的角色在改变场景时采用新的位置,我正在使用 Area2D 来检测玩家是否正在改变场景。 这是代码:

场景变化_检测代码:

extends Area2D

@export var scene_to_load: String = ""
#initial character position
var character_position: Vector2 = Vector2(0, 0)
@export var change_character_position: Vector2
@export var direction_facing: String = ""
signal scene_changed(change_character_position: Vector2)
signal direction(direction_facing)

func _on_body_entered(body):
    if body is CharacterBody2D:
        if scene_to_load != "":
            character_position = body.global_position
            get_tree().change_scene_to_file(scene_to_load)
            emit_signal("scene_changed", change_character_position):

#getters

func get_character_position() -> Vector2:
    return character_position

玩家代码:

extends CharacterBody2D

func _ready():
    var scene_change_detection = get_node("/root/SceneChangeDetection")
    scene_change_detection.scene_changed.connect(_on_scene_changed)

func _on_scene_changed(new_character_position: Vector2):
    print("Received scene_changed signal")
    $Dahlia.global_position = get_node("/root/SceneChangeDetection").new_character_position

问题

无论我做什么,_on_scene_changed 都不会被调用。我用 print 语句测试了发射是否被调用,确实如此。只有连接给我带来了问题。

我尝试在一个脚本中创建信号并尝试让它们调用 _on_signal_name() ,但没有一个实现这一点。 我的 Area2D 连接到 _on_body_entered 我的 CharacterBody2D 没有连接到任何东西(我不确定是否应该将它连接到某些东西)

我被这个问题困扰了一整天,请帮忙。

signals godot gdscript godot4
1个回答
0
投票

当一个节点被释放时,它的所有连接都会被断开。当场景发生变化时,之前场景中的所有节点都会被释放。

当然,您可以使用自动加载来解决这个问题,因为它们由于不属于场景变化而在场景变化中幸存下来。

我认为你的

Area2D
是自动加载的。但你的
CharacterBody2D
呢?

如果

CharacterBody2D
存在于之前的场景中,它将在对信号做出反应之前被释放。如果它存在于新场景中,则在发出信号时还不会连接。

如果您属于其中任何一种情况,答案是您不需要信号:当 Godot 在作为场景一部分的

_ready
中调用
CharacterBody2D
时,这意味着该场景已加载。

如果您需要将信息从一个场景保留到另一场景,您可以将其存储在自动加载中,然后让

CharacterBody2D
_ready
上读取它。

或者,您可以将

CharacterBody2D
设为自动加载的一部分(自动加载可以是脚本或场景),这样它也能在场景更改后幸存下来。在这种情况下,信号就有意义了。

© www.soinside.com 2019 - 2024. All rights reserved.