Godot中无法通过信号或GetNode访问PackedScene子节点求助
问题描述
我希望在编辑器中从Candlestick场景设置Body Hollow场景内Top节点的缩放属性。单独运行Body Hollow场景时一切正常,但运行Candlestick场景时功能失效。尝试用$Node获取Body Hollow节点后调用scale_x方法会出现空值错误,仿佛Top节点不存在。
节点树说明
- Candlestick场景:根节点为
Candlestick(Node2D类型),包含Body Hollow子节点 - Body Hollow场景:根节点为
Body Hollow(Node2D类型),包含Top子节点(Sprite2D类型)
相关代码
挂载到Candlestick的代码
class_name Candlestick extends Node2D @export var body_hollow: BodyHollow func _ready(): print("Candlestick is running...") func _process(_delta): if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT): body_hollow.scale_x(200)
挂载到Body Hollow的代码
class_name BodyHollow extends Node2D signal scale_changed(_x: float) func scale_x(_x: float) -> void: scale_changed.emit(_x) func _process(_delta): if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT): scale_x(200)
挂载到Top的代码
class_name BodyHollowHandles extends Sprite2D # 连接Body Hollow的scale_changed信号 func _on_body_hollow_scale_changed(_x): scale.x = _x scale.y = _x
解决方案
问题核心是信号未在场景实例化时正确连接:单独运行Body Hollow场景时,你可能在编辑器手动关联了scale_changed信号与Top节点的处理方法,但当Body Hollow作为子场景被嵌入Candlestick场景时,编辑器内的信号连接不会自动继承。
修复步骤
- 在代码中强制连接信号
修改Body Hollow的脚本,在_ready方法里主动找到Top节点并绑定信号,确保场景无论在哪实例化都能生效:
class_name BodyHollow extends Node2D signal scale_changed(_x: float) func _ready(): # 按编辑器内的节点名称查找Top节点(注意大小写一致) var top_node = $Top if top_node: scale_changed.connect(top_node._on_body_hollow_scale_changed) func scale_x(_x: float) -> void: scale_changed.emit(_x) func _process(_delta): if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT): scale_x(200)
- 校验节点引用有效性
在Candlestick脚本中添加空值判断,避免因节点未赋值导致的错误:
func _ready(): print("Candlestick is running...") if not body_hollow: print("错误:body_hollow节点未在编辑器中赋值!")
- 确认节点名称一致性
确保Top节点的名称与代码中$Top的写法完全一致(Godot节点名称区分大小写),避免找不到节点的情况。
完成以上修改后,无论单独运行Body Hollow场景,还是在Candlestick场景中调用,Top节点的缩放都能正常响应。
内容的提问来源于stack exchange,提问作者Christos Rymenidis
相关产品推荐
相关产品推荐

