【发布时间】:2020-04-26 15:29:24
【问题描述】:
我正在尝试创建一个具有武器系统的游戏,其中将有近战、火器等武器类型。我为数据创建了类,然后我将在另一个类中引用这些数据类并相应地执行任务(Fire、Reload 等)。
public abstract class WeaponData {
public int damage;
public abstract void Fire();
}
注意抽象的存在,我使用这个类作为基础,并使用每种武器都会有的常见东西。然后,我们将为继承上述此类的每种类型的武器创建类:
public class FirearmData : WeaponData {
public SupplyData ammoTypeData;
public int magazineSize;
public AnimationClip reloadAnimation;
public override void Fire() {
// blablabla...
}
}
这个类覆盖了 Fire() 方法并且还有一些其他不同的字段。这是另一个武器类型类:
public class MeleeWeaponData : WeaponData {
public AnimationClip swingAnimation;
public override void Fire() {
// blablabla...
}
}
到目前为止,我设法创建了这些类,但这并不意味着我将来不会创建更多像这两个这样的类,我把它留在这里是因为我发现这个系统无法工作.. .
所以我也有一个 Weapon 类,我将引用一个 WeaponData,它的方法会根据数据执行不同的任务。
public class Weapon {
public WeaponData data;
void Fire() {
data.Fire();
}
void Reload() {
// the problem is here;
}
}
所以问题就在这里,我在这个类中包含了数据需要的所有可能方法,但是如果你问我这并不优雅,因为 WeaponData 将是 MeleeWeaponData,在这种情况下,它不需要Reload() 方法或整数杂志字段。我仍然可以通过做一些开关来检查数据的类型来使它工作。但是每当我碰巧创建了更多的数据类型时,我都必须每次都到这里并在 switch 中添加一条语句。而我不希望那样。
所以我想为此咨询泛型,例如:
public class Weapon<T> where T : WeaponData {
}
但是正如你告诉我的那样,这也不会让我能够获得 WeaponData 子类的字段......
你们能找出一个适合我的系统吗?我正在 Unity 上制作游戏,如果这意味着什么,我确实使用 ScriptableObjects 来处理数据。
【问题讨论】:
-
因为您已将
T限制为X,但X没有field2。 -
field2是字段,它需要一个实例......但这并不能回答你真正的问题。 -
有没有办法访问它?不做 if (T is typeof(Y) something) 之类的事情?
-
@Masea 那对我来说是一个设计问题。如果您编辑您的问题以获取有关您正在尝试做什么的更多详细信息,也许我们可以建议一个更好的选择,但目前这似乎是一个 XY 问题(您试图通过做某事来解决问题 X,而这导致了问题 Y,但这根本不是 X 的真正解决方案,因此我们正在尝试解决错误的问题)。
-
好的,谢谢你们,我会尝试编辑我的 OP 并包含更多关于我想要实现的目标的深入信息。
标签: c# unity3d generics constraints