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

Godot C#开发:能否在接口中定义Signal信号?

Godot C#接口中定义伤害系统信号的解决方案

在Godot的C#环境中,接口无法直接通过[Signal]属性生成信号。原因是SignalName是Godot针对具体节点类自动生成的代码,接口不属于Godot节点类型,因此不会生成对应的SignalName.Killed成员,这就是你代码中报错的根本原因。

下面给出两种可行的解决方案:

方案一:实现类单独声明信号(符合Godot原生习惯)

直接在每个实现IDamageable的节点类中显式声明Killed信号,Godot会自动为该类生成对应的SignalName成员,这样就能正常调用EmitSignal了。

修改后的接口代码:

public interface IDamageable
{
    float HP { get; }
    bool ApplyDamage(float damage);
}

Unit类实现:

public class Unit : CharacterBody3D, IDamageable
{
    // 显式声明Killed信号
    [Signal]
    public delegate void KilledEventHandler(Node3D target);

    [Export]
    public float HP { get; private set; } = 10;

    public bool ApplyDamage(float damage)
    {
        HP -= damage;
        if (HP <= 0)
        {
            // 现在SignalName.Killed可以正常使用
            EmitSignal(SignalName.Killed, this);
        }
        return HP > 0;
    }
}

Planet类实现:

public class Planet : StaticBody3D, IDamageable
{
    [Signal]
    public delegate void KilledEventHandler(Node3D target);

    [Export]
    public float HP { get; private set; } = 10;

    public bool ApplyDamage(float damage)
    {
        HP -= damage;
        if (HP <= 0)
        {
            EmitSignal(SignalName.Killed, this);
        }
        return HP > 0;
    }
}

方案二:接口约定事件+实现类关联信号

如果需要在接口层面强制要求“可受伤害对象必须有死亡通知能力”,可以在接口中定义C#事件,让实现类将Godot信号和事件关联起来,兼顾接口约束和Godot原生信号系统。

修改后的接口代码:

using System;

public interface IDamageable
{
    // 用C#事件约定死亡通知
    event Action<Node3D> Killed;
    float HP { get; }
    bool ApplyDamage(float damage);
}

Unit类实现:

public class Unit : CharacterBody3D, IDamageable
{
    [Signal]
    public delegate void KilledEventHandler(Node3D target);

    // 实现接口的事件
    public event Action<Node3D> Killed;

    [Export]
    public float HP { get; private set; } = 10;

    public bool ApplyDamage(float damage)
    {
        HP -= damage;
        if (HP <= 0)
        {
            // 发射Godot信号
            EmitSignal(SignalName.Killed, this);
            // 触发C#事件
            Killed?.Invoke(this);
        }
        return HP > 0;
    }
}

这种方式既可以让其他代码通过接口订阅Killed事件,也能保留Godot编辑器中可视化连接信号的能力。

内容的提问来源于stack exchange,提问作者Megalord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:52:35