You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot 4.1:场景切换时信号无法连接致角色位置不更新求助

Godot 4.1场景切换时角色位置更新信号失效问题

需求场景

用Area2D检测玩家进入区域时触发场景切换,切换后将角色移动到指定位置。

相关代码

scene_change_detection.gd

extends Area2D

@export var scene_to_load: String = ""
#初始角色位置
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

Player.gd

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_body_entered内的emit_signal已执行,但Player的_on_scene_changed始终未被调用,尝试多种信号绑定方式均无效。

问题根源

  1. 节点销毁时机错误:调用get_tree().change_scene_to_file后,当前场景的所有节点(包括发出信号的scene_change_detection)会被立即销毁,后续的emit_signal无法正常执行。
  2. 信号连接逻辑无效:新场景加载后,Player是全新实例,它在_ready中连接的是新场景的scene_change_detection节点,而触发信号的是旧场景已销毁的节点,两者无关联。

解决方案

改用Autoload全局脚本传递场景切换的位置数据,替代跨场景信号传递:

步骤1:创建全局数据脚本

新建GlobalData.gd,内容如下:

extends Node

# 存储角色切换场景后的目标位置
var spawn_position: Vector2 = Vector2.ZERO
# 存储角色切换后的朝向
var spawn_direction: String = ""

在项目设置的「Autoload」面板中添加该脚本,命名为GlobalData(确保全局可访问)。

步骤2:修改scene_change_detection.gd

extends Area2D

@export var scene_to_load: String = ""
@export var change_character_position: Vector2
@export var direction_facing: String = ""

func _on_body_entered(body):
    if body is CharacterBody2D and scene_to_load != "":
        # 先将目标位置和朝向存入全局变量
        GlobalData.spawn_position = change_character_position
        GlobalData.spawn_direction = direction_facing
        # 再执行场景切换
        get_tree().change_scene_to_file(scene_to_load)

步骤3:修改Player.gd

extends CharacterBody2D

func _ready():
    # 场景加载完成后,从全局变量读取目标位置并设置
    $Dahlia.global_position = GlobalData.spawn_position
    # 按需处理角色朝向
    if GlobalData.spawn_direction != "":
        # 此处添加朝向逻辑,例如翻转Sprite
        # $Dahlia.flip_h = (GlobalData.spawn_direction == "left")
        pass

额外检查项

  • 确保Area2D的CollisionShape2D已正确配置,能检测到Player的CharacterBody2D
  • 确认scene_to_load的路径格式正确(如res://scenes/TargetScene.tscn)
  • 新场景中Player节点能正确引用$Dahlia子节点

内容的提问来源于stack exchange,提问作者Todu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:15:57