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
相关产品推荐
相关产品推荐

