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