Godot 4.2 C#:实例化子节点信号连接父节点报错求助
解决Godot 4.2 C#信号连接报错问题
问题根源
你的代码存在两个核心问题:
- 信号名称不匹配:子场景中定义并触发的信号是
OnKnobChangeEventHandler,但父节点连接时用的是"OnKnobChange",两者名称不一致导致Godot找不到对应信号。 - Connect参数使用错误:Godot 4的旧版字符串形式Connect,第三个参数需要传入方法名的字符串,而非直接传方法引用;另外你用
GetNode<Node>获取子节点,属于基类类型,没有强类型支持,容易出错。
修正方案
步骤1:规范子场景信号定义(可选但推荐)
将委托名简化为更直观的OnKnobChange,避免混淆:
[Signal] public delegate void OnKnobChange(float val); // 触发信号时 EmitSignal(nameof(OnKnobChange), value); // value为float类型变量
步骤2:父节点修正连接逻辑
推荐使用类型安全的事件订阅方式(Godot 4 C#官方推荐),替代字符串形式的Connect:
private float _heading = 30; private float _course = 30; private Label _lbl_heading; private Label _lbl_course; // 替换为子场景脚本的实际类型,比如你的子脚本叫KnobScript private KnobScript _courseKnob; private KnobScript _headingKnob; public override void _Ready() { _lbl_heading = GetNode<Label>("lbl_heading"); _lbl_course = GetNode<Label>("lbl_course"); // 获取子节点的具体脚本实例,而非Node基类 _courseKnob = GetNode<KnobScript>("Bezel/KnobHeading"); _headingKnob = GetNode<KnobScript>("Bezel/KnobCourse"); // 类型安全的信号订阅,直接用事件+=方式 _courseKnob.OnKnobChange += OnCourseKnobSignalReceived; } private void OnCourseKnobSignalReceived(float value) { _course += value; }
若坚持使用旧版Connect方式
如果一定要用字符串形式的Connect,需要修正信号名称和参数:
// 确保信号名称和子场景定义一致 _courseKnob.Connect(nameof(KnobScript.OnKnobChange), this, nameof(OnCourseKnobSignalReceived));
关键注意事项
- 子场景脚本必须继承自
Godot.Node或其子类,否则信号无法被识别。 - 确保父节点路径
"Bezel/KnobHeading"正确,节点存在且挂载了对应的子脚本。
内容的提问来源于stack exchange,提问作者DarwinIcesurfer
相关产品推荐
相关产品推荐

