在Unity中创建能力对象

4

在选择角色时,我目前拥有一个基础职业。

abstract class CharacterClass
    {
        public abstract void AbilityOne();

        public abstract void AbilityTwo();
    }

我的字符来自于这个类。
class Warrior : CharacterClass
{
    public override void AbilityOne()
    {
        // implement ability one here
    }

    public override void AbilityTwo()
    {
        // implement ability two here
    }
}

最后,我使用这段代码选择战士。
CharacterClass selectedClass = new Warrior(); // start the game as a Warrior

这种方式非常有效。但是当涉及到冷却等问题时,我希望保持代码的简洁性,因此考虑创建一个Ability类。

我的抽象父类

abstract class CharacterClass
{
    public Ability AbilityOne { get; set; }

    public Ability AbilityTwo { get; set; }
}

战士职业
class Warrior : CharacterClass
{
    public Warrior()
    {
        // Set the new Abilities
        AbilityOne = new Ability(3, Smash()); // pass in the method as a parameter ??
        AbilityTwo = new Ability(7, Shieldblock());
    }

            private void Smash()
    {
        // Ability 1
    }

    private void ShieldBlock()
    {
        // Ability 2
    }
}

我的技能类别
class Ability
    {
        public Ability(int cooldown, [the ability method here])
        {
            CoolDown = cooldown;
            TheAbility = ? the ability parameter ?
        }

        public int CoolDown { get; set; }

        public void TheAbility(){}
    }

所以战士将传递他的两个技能并创建两个能力对象。在游戏中,我可以编写:

CharacterClass selectedClass = new Warrior();
selectedClass.AbilityOne();

这将导致一个冷却时间为3秒的碎片。有没有办法实现这个功能呢?


1
我强烈建议您研究Unity的ScriptableObjects来处理这种情况。我曾经这样做过,从此不再回头。标准类和Monobehaviours并不能完全提供您想要实现的功能。 - Catwood
2个回答

3

由于 AbilityOne 返回一个 Ability 对象,因此在 Ability 类中创建处理能力可能具有的不同逻辑的基础设施是有意义的,例如在某些 Update() 方法中运行冷却计时器上的时钟,使用该能力等。

因此,调用您的能力的代码应类似于:

selectedClass.AbilityOne.Trigger();

将能力方法存储为System.Action在你的能力类中也是有意义的。

class Ability
{
    public Ability(int cooldown, System.Action _abilityMethod)
    {
        CoolDown = cooldown;
        abilityMethod = _abilityMethod;
    }

    public int CoolDown { get; set; }

    public void Trigger()
    {
        if( abilityMethod != null )
        {
            abilityMethod();
        }
    }

    private System.Action abilityMethod;
}

2
您应该能够像这样做:
class Ability
{
    public Ability(int cooldown, Action ab)
    {
        CoolDown = cooldown;
        TheAbility = ab;
    }

    public int CoolDown { get; set; }

    public Action TheAbility;
}


class Warrior : CharacterClass
{
    public Warrior()
    {
        // Set the new Abilities
        AbilityOne = new Ability(3, Smash);
        AbilityTwo = new Ability(7, ShieldBlock);

        AbilityOne.TheAbility(); // Will run Smash() method
    }

    private void Smash()
    {
        // Ability 1
    }

    private void ShieldBlock()
    {
        // Ability 2
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接