GFramework/GFramework.Godot.SourceGenerators
GeWuYou 973a3c3cb4 test(registration): 添加自动注册导出集合生成器测试
- 添加了批量注册方法生成的基础功能测试
- 添加了集合元素类型推断失败时的诊断报告测试
- 添加了数组参数注册方法的生成测试
- 添加了从继承接口获取注册方法的测试
- 添加了显式接口实现成员不可访问的诊断测试
- 添加了从基类获取注册方法的测试
- 添加了从基类获取注册器成员的测试
- 添加了非实例可读集合成员的诊断测试
- 添加了非实例可读注册器成员的诊断测试
- 添加了注册方法不可访问的诊断测试
- 添加了属性参数无效时的诊断测试
- 添加了多个分部声明时只生成一个源文件的测试
2026-04-13 20:18:47 +08:00
..

GFramework.Godot.SourceGenerators

面向 Godot 场景的源码生成扩展模块,减少模板代码。

主要功能

  • 与 Godot 场景相关的编译期生成能力
  • 基于 Roslyn 的增量生成器实现
  • [GetNode] 字段注入,减少 _Ready() 里的 GetNode<T>() 样板代码
  • [BindNodeSignal] 方法绑定,减少 _Ready() / _ExitTree() 中重复的事件订阅样板代码

使用建议

  • 仅在 Godot + C# 项目中启用
  • 非 Godot 项目可只使用 GFramework.SourceGenerators

GetNode 用法

using GFramework.Godot.SourceGenerators.Abstractions;
using Godot;

public partial class TopBar : HBoxContainer
{
    [GetNode]
    private HBoxContainer _leftContainer = null!;

    [GetNode]
    private HBoxContainer _rightContainer = null!;

    public override void _Ready()
    {
        __InjectGetNodes_Generated();
        OnReadyAfterGetNode();
    }

    private void OnReadyAfterGetNode()
    {
    }
}

当未显式填写路径时,生成器会默认将字段名推导为唯一名路径:

  • _leftContainer -> %LeftContainer
  • m_rightContainer -> %RightContainer

BindNodeSignal 用法

using GFramework.Godot.SourceGenerators.Abstractions;
using Godot;

public partial class Hud : Control
{
    [GetNode]
    private Button _startButton = null!;

    [GetNode]
    private SpinBox _startOreSpinBox = null!;

    [BindNodeSignal(nameof(_startButton), nameof(Button.Pressed))]
    private void OnStartButtonPressed()
    {
    }

    [BindNodeSignal(nameof(_startOreSpinBox), nameof(SpinBox.ValueChanged))]
    private void OnStartOreValueChanged(double value)
    {
    }

    public override void _Ready()
    {
        __InjectGetNodes_Generated();
        __BindNodeSignals_Generated();
    }

    public override void _ExitTree()
    {
        __UnbindNodeSignals_Generated();
    }
}

生成器会产出两个辅助方法:

  • __BindNodeSignals_Generated():负责统一订阅事件
  • __UnbindNodeSignals_Generated():负责统一解绑事件

当前设计只处理 CLR event 形式的 Godot 事件绑定,不会自动调用 Connect() / Disconnect()