Как определить какой параметр должен изменить бафф/эффект?

Я хочу реализовать систему эффектов Unity. Я храню параметры и эффекты в словарях, а потом применяю эффект на параметр. Хочу узнать как можно определить на какой параметр влияет эффект? Пробовал реализовать с помощью enum (есть enum ParameterType и у баффа в переменной parameterType выбираю параметр), но у меня есть типы параметров: характеристики и скиллы. Их типы неудобно использовать в одном enum. Но я не хочу чтобы бафф хранил две переменные enum-ов: параметров и скиллов, потому что приходится создавать больше словарей и проверок. Правильно ли реализовывать определение изменяемого параметра по id? Так непонятно какой параметр изменяю в коде. А по имени определять объект не рекомендуют.


public enum ParameterType //параметры
{
    health,
    mana,
    hunger
}

public enum SkillType //скиллы
{
    attackSpeed,
    damage,
    moveSpeed
}

public class Effect //эффект применяемый к характеристике
{
    public ParameterType parameterType; //только одна переменная используется для определения параметра
    public SkillType skillType; //другая получается лишняя она определяет не скилловый/параметровый ли эффект
}


public Stats : MonoBehaviour //скрипт характеристик
{
    public Dictionary <ParameterType, float> parameters;
    public Dictionary <SkillType, float> skills;
    
    //образовались два словаря для скилловых и для параметровых эффектов
    public Dictionary <Parameters, Effect> parametersEffects;
    public Dictionary <SkillType, Effect> skillEffects;

    void Update()
    {
         float health = parameters[ParameterType.health]; //определяю жизнь
         if (parametersEffects.ContainsKey(ParameterType.health)) //если health есть в словаре
         {
               health += parametersEffects[ParameterType.health]; //прибавляю жизнь и удаляю эффект
               parametersEffects.Remove(ParameterType.health);
         }
    }
}

Ответы (1 шт):

Автор решения: singletonsEnjoyer

Очень странно, что ты вообще хранишь эффекты в enum. В дальнейшем ты столкнёшься с кучей( и я говорю не 5-10, а 40-50) if/else в твоём коде, из-за чего тебе будет очень сложно исправлять баги и поддерживать его в целом. Напиши абстрактный класс Effect, в котором будут поля - duration, canEffectStack, и.т.д, а также абстрактные методы - Activate, Acting/Apply,Finish, которые будут реализовывать наследники и добавлять свои поля + методы. Таким образом у тебя будет гибкая система, которую легко расширять, а не спагетти-код. Хранить статы(как ты называешь, скиллы) в enum не нужно. Напиши структуру, в которой будут поля - attackSpeed,moveSpeed,damage, создай её экземпляр и вбей значения. Надеюсь, я тебе помог.

→ Ссылка