我可以在 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 才能访问它的方法变体。这只是额外的工作,没有明显的优势。
我正在制作一个纸牌游戏,我在其中为纸牌分配随机效果,因此我需要在运行时仅使用 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 才能访问它的方法变体。这只是额外的工作,没有明显的优势。