我遇到了信号问题,我试图让我的角色在改变场景时采用新的位置,我正在使用 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 没有连接到任何东西(我不确定是否应该将它连接到某些东西)
我被这个问题困扰了一整天,请帮忙。
当一个节点被释放时,它的所有连接都会被断开。当场景发生变化时,之前场景中的所有节点都会被释放。
当然,您可以使用自动加载来解决这个问题,因为它们由于不属于场景变化而在场景变化中幸存下来。
我认为你的
Area2D
是自动加载的。但你的CharacterBody2D
呢?
如果
CharacterBody2D
存在于之前的场景中,它将在对信号做出反应之前被释放。如果它存在于新场景中,则在发出信号时还不会连接。
如果您属于其中任何一种情况,答案是您不需要信号:当 Godot 在作为场景一部分的
_ready
中调用 CharacterBody2D
时,这意味着该场景已加载。
如果您需要将信息从一个场景保留到另一场景,您可以将其存储在自动加载中,然后让
CharacterBody2D
在_ready
上读取它。
或者,您可以将
CharacterBody2D
设为自动加载的一部分(自动加载可以是脚本或场景),这样它也能在场景更改后幸存下来。在这种情况下,信号就有意义了。