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

Godot 4.2 C#:实例化子节点信号连接父节点报错求助

解决Godot 4.2 C#信号连接报错问题

问题根源

你的代码存在两个核心问题:

  1. 信号名称不匹配:子场景中定义并触发的信号是OnKnobChangeEventHandler,但父节点连接时用的是"OnKnobChange",两者名称不一致导致Godot找不到对应信号。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:22:51