Как настроить уникальное поведение с объектами Scriptable (система умений и способностей) - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу создать сложную систему навыков / умений в Unity, в которой могут быть некоторые условия для запуска уникального поведения и другие вещи.Например, у меня есть навык под названием Shatter, который наносит урон и имеет некоторые условия: если враг истекает кровью, применяет Armor Break.Если вражеская броня сломана, применяется Кровотечение.Если затронуты оба, примените больше стеков Кровотечения.Это всего лишь пример того, какой тип поведения / условий я хочу, чтобы мои навыки имели.

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

Это то, что я использовал для создания Shatter (наследуется от WarriorSkill, чтонаследует от Skill) работает с монобихевиоризмом / наследованием (в данном примере условия просто дебаффы):

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);
    }
}

При этом мне нужно было адаптироваться к некоторым заранее подготовленным ограничениям на создание экземпляров / сериализацию, например, я не смогпросто перетащите n-drop префабов с кровоизлиянием и коагуляцией в префаб Bleeding, потому что когда я его создаю, он показывает Empty.Те «плохие решения», которые я получил, не сделали меня удовлетворенным, и когда я писал код, появлялись новые проблемы.Итак, теперь я пытаюсь исправить и улучшить свой код с помощью объектов, доступных для сценариев.Важно отметить, что у каждого навыка есть некоторые действительно особые особенности / условия и уникальное поведение, подобное этой способности Shatter.Я могу описать больше примеров, если это необходимо.

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