我在做一个卡牌游戏,我给卡牌分配随机效果,所以我需要在运行时加载效果的代码,只需要加载类名。
我不知道我的抽象类和子类做得是否正确,我也不知道到底如何从路径中获取所需的类。我知道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;
}
...
任何帮助都深表感谢,谢谢,抱歉我对抽象类的理解明显不足。
根据评论,我认为Overriding就是你要找的Droid。对于Polymorphy,有两种方式可以解决不同的Implementation。
在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以获得它的方法变体的访问权。这只是额外的工作,没有明显的优势。