Могу ли я загрузить абстрактный класс во время выполнения в Unity? - PullRequest
0 голосов
/ 06 мая 2020

Я делаю карточную игру, в которой назначаю случайные эффекты картам, поэтому мне нужно загрузить код эффекта во время выполнения только с именем класса.

Я не знаю, есть ли мой абстрактный класс и child выполнены правильно, и я также точно не знаю, как получить нужный класс из пути. Я знаю, что 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;

    }

...

Любая помощь приветствуется, спасибо и извините за мое явное непонимание абстрактных классов.

1 Ответ

0 голосов
/ 06 мая 2020

Судя по комментариям, я думаю, что Overriding - это именно тот дроид, которого вы ищете. С Polymorphy существует два способа разрешения различных реализаций.

  • скрытие возможно по умолчанию. Однако это также бесполезно. Мы думали, что это одна из тех вещей, которая нам нужна, и теперь все добавляют ее на свой OOP язык. Но кроме того, что я не использовал скрытие, когда я хотел перезаписать, я никогда не использовал его.
  • Важная вещь - это переопределение. Однако переопределение должно быть разрешено для функции в базовом классе, которая ее добавила первой.

In Effect:

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

In 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, чтобы получить доступ к его варианту метода. Это просто лишняя работа без очевидного преимущества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...