如何使用可脚本编写的对象设置独特的行为(技能/能力系统)

时间:2018-12-28 22:31:37

标签: c# unity3d

我想在Unity上创建一个复杂的技能/能力系统,该系统可能有一些条件可以触发独特的行为等。例如,我有一个名为“碎裂”的技能,会造成伤害并具有一定条件:如果敌人当前正在流血,则施加护甲断裂。如果敌人的盔甲破损,则应用流血。如果两者都影响,则应用更多的出血点。这只是我希望自己的技能具有哪种行为/条件的一个例子。

我已经创建了一个,并使其能够处理大量的预制件,实例化和单行为/继承性混乱,但是它向我展示了一些我无法解决的问题,所以现在我尝试使用可脚本化对象和我决定暂时重写游戏。

这就是我用来使Shatter(从WarriorSkill继承而来,继承自Skill)与monobehaviour / inheritance结合使用的情况(在此示例中,条件只是减益):

public class Shatter : WarriorSkill, IConditionable
{
    public GameObject armorBreakCondition, bleedingCondition, hemorrhageCondition, coagulationCondition;

    [SerializeField] double damage;

    public double Damage { get { return damage; } private set { damage = value;}

    public override void OnActivate()
    {
        base.OnActivate();
        target.TakeDamage(Damage);

        bool bleeding = false;
        bool armorBreak = false;

        foreach(Transform condition in target.conditionsPanel.transform)
        {
            if (condition.GetComponent<Condition>().GetType() == typeof(Bleeding))
                bleeding = true;

            if (condition.GetComponent<Condition>().GetType() == typeof(CArmorBreak))
                armorBreak = true;
        }

        if(bleeding && armorBreak)
        {
            FindObjectOfType<Bleeding>().AddStacks(4);
        }
        else if(armorBreak)
        {
            OnCondition(bleedingCondition);
        }
        else if(bleeding)
        {
            OnCondition2(armorBreakCondition);
        }
    }

    private void OnCondition(GameObject condition)
    {
        condition.GetComponent<Bleeding>().hemorrhageCondition = hemorrhageCondition;
        condition.GetComponent<Bleeding>().coagulationCondition = coagulationCondition;
        target.AddCondition(condition);
    }

    private void OnCondition2(GameObject condition)
    {
        condition.GetComponent<CArmorBreak>().armorBreak = 0.25f;
        condition.GetComponent<CArmorBreak>().duration = 50;
        target.AddCondition(condition);
    }
}

因此,我需要适应一些预制实例化/序列化限制,例如,我无法将出血和凝血预制件拖放到出血预制件上,因为当我实例化它时,它显示为空。我得到的那些“不好的解决方案”并没有使我满意,并且在编写代码时出现了更多的问题。因此,现在我正在尝试使用可编写脚本的对象来修复和改进代码。重要的是要注意,每项技能都有一些非常特殊的功能/条件和独特的行为,例如“破碎”能力。如有必要,我可能会描述更多示例。

0 个答案:

没有答案