Auxiliary source generator for the Godot project, with some methods extracted from Godot.SourceGenerators
.
辅助 Godot 项目的源生成器, 部分方法提取自 Godot.SourceGenerators
.
...
<ItemGroup>
<ProjectReference Include="GodotHelper.SourceGenerators.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
</ItemGroup>
...
Some features also require / 部分功能还需要:
...
<ItemGroup>
<AdditionalFiles Include="project.godot" />
</ItemGroup>
...
First Code / 首先手写:
using GodotHelper.SourceGenerators.Attributes;
public partial class MyNode : Node2D
{
[AutoGet] Button button;
[AutoGet(nameof(NodeA))] Node NodeA;
[AutoGet(notNull: false)] Node2D Node2D { get; set; }
[AutoGet("Node/Label")] Label label;
}
Generated Code / 生成的代码:
public void GetNodes()
{
button = GetNode<global::Godot.Button>("%button");
NodeA = GetNode<global::Godot.Node>("NodeA");
Node2D = GetNodeOrNull<global::Godot.Node2D>("%Node2D");
label = GetNode<global::Godot.Label>("Node/Label");
}
Use / 使用:
public override void _Ready()
{
GetNodes();
...
}
First Code / 首先手写:
[Rpc(MultiplayerApi.RpcMode.AnyPeer)]
public void RegisterPlayer(string newPlayerName)
{
...
}
Generated Code / 生成的代码:
/// <inheritdoc cref="RegisterPlayer"/>
public void RpcRegisterPlayer(string newPlayerName)
{
Rpc(MethodName.RegisterPlayer, newPlayerName);
}
Use / 使用:
public void XX()
{
RpcRegisterPlayer("play1");
}
First Code / 首先手写:
[Signal] public delegate void DeathEventHandler();
Generated Code / 生成的代码:
/// <inheritdoc cref="DeathEventHandler"/>
public void EmitDeath(int hp)
{
EmitSignal(SignalName.Death, hp);
}
Use / 使用:
public void XX()
{
EmitDeath(-67);
}
First Code / 首先手写:
using GodotHelper.SourceGenerators.Attributes;
public partial class MyNode : Node2D
{
[Notify] int _hp;
}
Generated Code / 生成的代码:
public event Action<int, int> HpChanged;
partial void OnHpChanging(int oldValue, int newValue);
partial void OnHpChanged(int oldValue, int newValue);
/// <inheritdoc cref="_hp"/>
public int Hp
{
get => _hp;
set
{
if (!EqualityComparer<int>.Default.Equals(_hp, value))
{
var oldValue = _hp;
OnHpChanging(oldValue, value);
_hp = value;
OnHpChanged(oldValue, value);
HpChanged?.Invoke(oldValue, value);
}
}
}
Use / 使用:
public partial class MyNode : Node2D
{
public void XX()
{
HpChanged += YY;
Hp -= 1;
}
partial void OnHpChanging(int oldValue, int newValue)
{
// you code
}
partial void OnHpChanged(int oldValue, int newValue)
{
// you code
}
}
Require Set AdditionalFiles. And Godot Set AutoLoad.
First Code / 首先手写:
using GodotHelper.SourceGenerators.Attributes;
[AutoLoadGet]
public partial class MyAutoLoad : Node2D
{
...
}
Generated Code / 生成的代码:
public partial class MyAutoLoad
{
partial void OnInit();
public MyAutoLoad()
{
Ready += ReadyCallback;
OnInit();
}
#pragma warning disable CS0109
partial void OnReady();
public new void ReadyCallback()
{
AutoLoad.MyAutoLoad = this;
AutoLoad.MyAutoLoad2 ??= GetNode("/root/MyAutoLoad2");// is not c#
OnReady();
}
#pragma warning restore CS0109
}
public partial class AutoLoad
{
public static Node MyAutoLoad2 { get; set; } = null!;
public static global::MyAutoLoad MyAutoLoad { get; set; } = null!;
}
}
Use / 使用:
public override void _Ready()
{
AutoLoad.MyAutoLoad.XXX = XX;
...
}
using GodotHelper.SourceGenerators.Attributes;
[AutoLoadGet]
public partial class MyAutoLoad : Node2D
{
...
partial void OnInit()
{
// you code
}
partial void OnReady()
{
// you code
}
...
}
Require Set AdditionalFiles. And Godot Set Input.
First Code / 首先手写:
need not
Generated Code / 生成的代码:
public partial class InputActionName
{
public static readonly StringName MoveUp = "MoveUp";
public static readonly StringName MoveDown = "MoveDown";
}
Use / 使用:
public override void _Input(InputEvent @event)
{
if (@event.IsActionPressed(InputActionName.MoveUp))
{
...
}
}