Godot C# 子节点信号调用父节点方法报Method not found如何解决
问题原因
你的代码逻辑本身是成立的,报错Method not found是因为Godot引擎默认无法识别C#类中未显式暴露给引擎侧的方法,即使方法声明为public也需要额外标记才能被信号回调调用。
修复方案
适配Godot 3.x 版本(你当前的API写法对应3.x)
- 给父节点
Main_control的目标方法添加[Godot.Method]特性,暴露给引擎调用
修改后的父节点代码:
public class Main_control : Control { public override void _Ready() { } // 新增Method特性,将方法暴露给Godot引擎 [Godot.Method] public void mnk_show_game() { GD.Print("mnk_show_game reached"); } }
- 可选优化:避免硬编码方法名、添加空校验,减少拼写错误和空引用风险
修改后的子节点_Ready方法:
public override void _Ready() { game_controller = GetParent<Godot.Control>(); // 校验父节点存在后再连接信号 if (game_controller != null) { // 用nameof语法代替硬编码字符串,编译时即可校验方法名正确性 this.Connect("mnk_game_finished", game_controller, nameof(Main_control.mnk_show_game)); } }
适配Godot 4.x 版本
如果使用的是Godot 4.x,C#信号API有更新,推荐使用强类型连接方式,无需额外加Method特性:
修改子节点_Ready方法即可:
public override void _Ready() { if (GetParent() is Main_control mainCtrl) { // 4.x支持直接用C#事件语法绑定信号 mnk_game_finished += mainCtrl.mnk_show_game; } }
验证操作
修改完成后先完整编译C#项目,再运行场景,调用子节点的any_method方法即可正常触发父节点的mnk_show_game逻辑。
内容的提问来源于stack exchange,提问作者33fred33
相关产品推荐
相关产品推荐

