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

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

我在做一个卡牌游戏,我给卡牌分配随机效果,所以我需要在运行时加载效果的代码,只需要加载类名。

我不知道我的抽象类和子类做得是否正确,我也不知道到底如何从路径中获取所需的类。我知道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));
                }

这是我的抽象类的代码

    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;

    }

...

任何帮助都深表感谢,谢谢,抱歉我对抽象类的理解明显不足。

c# unity3d runtime load abstract-class
1个回答
0
投票

根据评论,我认为Overriding就是你要找的Droid。对于Polymorphy,有两种方式可以解决不同的Implementation。

  • 隐藏可能是默认的。然而,它也是非常无用的。它是我们认为需要的东西之一,现在大家都把它添加到他们的OOP语言中。但是除了不用hidden之外,当我 想要 覆盖,我从来没有用过它。
  • 覆盖才是最重要的。但是,必须允许在首先添加的基类中的函数进行覆盖。

在Effect中。

//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的版本。

增加一个Effect子类?只要它还覆盖了 Execution() 它的工作原理是一样的。

效果版本可以空转为抽象版本。或者作为所有子类的默认版本。

如果使用隐藏,你将不得不把它投回Spark以获得它的方法变体的访问权。这只是额外的工作,没有明显的优势。

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