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

Godot C#中如何同时使用接口与[Signal]特性?

在Godot C#中同时使用接口与[Signal]特性的解决方案

我不确定这是不是Godot的限制——我正尝试在C#文件里声明事件。在Godot中,给委托声明加上[Signal]特性后,引擎会自动生成对应的事件,这时可以用Godot的connect机制替代标准的EventName += Method;语法。但问题是,这个特性只有在Godot节点体系的public partial类里声明[Signal] delegate...时才生效,这样一来接口就没法包含这些事件声明了。想问问这种场景下有没有办法同时用接口和[Signal]特性?

代码示例

生命组件代码

using Godot;

namespace Game.Component {
  public delegate void CurrentLifeChangedEventHandler(GodotObject sender, int amount); 
  public delegate void MaximumLifeChangedEventHandler(GodotObject sender, int amount); 
  public delegate void ExtraLifeChangedEventHandler(GodotObject sender, int amount); 
  public delegate void CurrentLifeReachedZeroEventHandler(GodotObject sender); 
  public delegate void MaximumLifeReachedZeroEventHandler(GodotObject sender); 
  public delegate void ExtraLifeReachedZeroEventHandler(GodotObject sender); 
  
  public interface ILifeComponent {
    event CurrentLifeChangedEventHandler CurrentLifeChanged; 
    event MaximumLifeChangedEventHandler MaximumLifeChanged; 
    event ExtraLifeChangedEventHandler ExtraLifeChanged; 
    event CurrentLifeReachedZeroEventHandler CurrentLifeReachedZero; 
    event MaximumLifeReachedZeroEventHandler MaximumLifeReachedZero; 
    event ExtraLifeReachedZeroEventHandler ExtraLifeReachedZero; 

    void InitializeHealth();
    void IncreaseMaximumLife(int amount);
    void IncreaseExtraLife(int amount);
    void TakeDamage(IDamage damage);  
    void HealLife(IHeal heal);
  }

  public partial class LifeComponent : Node, ILifeComponent{
    public event CurrentLifeChangedEventHandler CurrentLifeChanged; 
    public event MaximumLifeChangedEventHandler MaximumLifeChanged; 
    public event ExtraLifeChangedEventHandler ExtraLifeChanged; 
    public event CurrentLifeReachedZeroEventHandler CurrentLifeReachedZero; 
    public event MaximumLifeReachedZeroEventHandler MaximumLifeReachedZero; 
    public event ExtraLifeReachedZeroEventHandler ExtraLifeReachedZero; 
}

抗性弱点组件代码

using Godot;
using Godot.Collections;

namespace Game.Component {

  public partial class ResistanceVulnerabilityComponent : Node, IResistanceVulnerabilityComponent {
    [Signal] public delegate void GainedResistanceEventHandler();
    [Signal] public delegate void GainedVulnerabilityEventHandler();
    [Signal] public delegate void LostResistanceEventHandler();
    [Signal] public delegate void LostVulnerabilityEventHandler();
}

补充说明

  • 【使用C#事件】截图
  • 【使用Godot信号】截图

另外,我觉得Godot节点必须使用public partial class的设定有些奇怪。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:05:01