是否可以在C#接口中定义Godot Signal?

问题描述 投票:0回答:1

我必须在我的游戏中实施伤害系统。我有多个类,可能会损坏(单位、行星等)。

每个可能损坏的节点都实现了IDamageable接口。 Godot 信号 Killed 似乎没有产生,也不存在。

简化代码在这里

public interface IDamageable
{
    [Signal]
    delegate void KilledEventHandler(Node3D target); // Will used to untarget current target of unit or remove it from UI selection info
    float HP { get;}

    bool ApplyDamage(float damage);
}

public class Unit : CharacterBody3D, IDamageable
{
    [Export]
    public float HP { get; private set; } = 10;

    public bool ApplyDamage(float damage)
    {
        HP -= damage;
        if (HP <= 0)
        {
            EmitSignal(SignalName.Killed); // SignalName.Killed doesn't exists
        }
        return HP > 0;
    }
}

public class Planet : StaticBody3D, IDamageable
{
    [Export]
    public float HP { get; private set; } = 10;

    public bool ApplyDamage(float damage)
    {
        HP -= damage;
        if (HP <= 0)
        {
            EmitSignal(SignalName.Killed); // SignalName.Killed doesn't exists
        }
        return HP > 0;
    }
}

有没有可能在C#接口中定义Godot Signal?

c# events delegates godot godot4
1个回答
0
投票

添加此功能的拉取请求正在等待处理: https://github.com/godotengine/godot/pull/83889 目前无法使用。

我最终决定将 Damagable 制作为(在您的情况下)CharacterBody3D 的子类,但我知道当您的行星处于静态时,情况会有所不同。

我能想到的唯一解决方法是通过组件处理可损坏性,即创建一个节点和一个扩展它的自定义类,该节点可处理无损坏并具有信号,并且根本没有 IDamagable,或者如果您认为需要它,您可以将自定义类作为其中的财产。

© www.soinside.com 2019 - 2024. All rights reserved.