我必须在我的游戏中实施伤害系统。我有多个类,可能会损坏(单位、行星等)。
每个可能损坏的节点都实现了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?
添加此功能的拉取请求正在等待处理: https://github.com/godotengine/godot/pull/83889 目前无法使用。
我最终决定将 Damagable 制作为(在您的情况下)CharacterBody3D 的子类,但我知道当您的行星处于静态时,情况会有所不同。
我能想到的唯一解决方法是通过组件处理可损坏性,即创建一个节点和一个扩展它的自定义类,该节点可处理无损坏并具有信号,并且根本没有 IDamagable,或者如果您认为需要它,您可以将自定义类作为其中的财产。