我可以在 Unity 中的运行时加载抽象 class 吗?

Can I load an abstract class at runtime in Unity?

我正在制作一个纸牌游戏,我在其中为纸牌分配随机效果,因此我需要在运行时仅使用 class 名称加载效果代码。

我不知道我的abstract class 和child 是否正确完成,我也不知道如何从路径中获取所需的class。 我知道 Resouces.Load 行不通,但我会把它留在那里,以便更轻松地传达我想做的事情。

public class GameManager : MonoBehaviour
{

 public Effect effect;

 ...

 effect = Resources.Load<Effect>("Card/Effects/" + c.cardActual.effect1);

                if (effect.Execution())
                {
                    StartCoroutine(TargetAndCastSpell(c,p));
                }

这是我的摘要代码 class

    public abstract class Effect : MonoBehaviour
{
    public string targetType;
    public List<int> availableTargets;
    public int effectTier;
    public PlayerHolder playerTarget;
    public CardPhysicalInstance minionTarget;
    public PlayerHolder caster;
    public void EffectX(PlayerHolder PlayerTarget, CardPhysicalInstance MinionTarget)
    {
    }
    public bool Execution()
    {
        return false;
    }

}

最后是我想在运行时加载的子项

 class Spark : Effect
{
    string targetType = "any";
    //Deal 1 damage to any target

    public bool Execution ()
    {
        bool canTarget = false;
        caster = GameManager.singleton.currentPlayer;
        availableTargets = SpellHelper.AvailableTargets();
        if (targetType == "any") //Placeholder check
        {
            canTarget = true;
            caster.playerState = GameManager.PlayerState.targeting;
        }


        return canTarget;

    }

...

非常感谢任何帮助,感谢并抱歉我对抽象 classes 的明显缺乏理解。

根据评论,我认为 Overriding 就是您要找的 Droid。使用多态,可以通过两种方式解决不同的实现。

  • 隐藏可能是默认的。但是,它也几乎没用。这是我们认为我们需要的东西之一,现在每个人都将它添加到他们的 OOP 语言中。但是除了在我想要覆盖时不使用隐藏之外,我从来没有用过它。
  • 重写是最重要的。但是,必须允许覆盖首先添加它的基 class 中的函数。

生效:

//Stil work how it does, but now can be overridden
public virtual bool Execution()
{
    return false;
}

在 Spark 中:

//We are actually overriding - not just hiding - Effect.Execution() here
public override bool Execution ()
{
    bool canTarget = false;
    caster = GameManager.singleton.currentPlayer;
    availableTargets = SpellHelper.AvailableTargets();
    if (targetType == "any") //Placeholder check
    {
        canTarget = true;
        caster.playerState = GameManager.PlayerState.targeting;
    }


    return canTarget;

}

你可以将一个Spark赋值给一个Effect变量,调用Execution(),Polymorphy会处理调用Spark的版本。

再添加一个效果子class?只要它也覆盖 Execution() 它的工作原理是一样的。

效果版本可以empty/turned抽象。或者保留为所有子classes.

的默认版本

通过隐藏,您必须将其转换回 Spark 才能访问它的方法变体。这只是额外的工作,没有明显的优势。