сцене есть предметы, которые можно подбирать (далее "пикапы"). Эти пикапы влияют на персонажа, например, наносят урон или прибавляют здоровье. то есть, понятная и обычная тема. Но я задумался сделать немного другую штуку: сделать только один класс предмета, полем которого является массив логических эффектов, которые будут накладываться на персонажа при оверлапе. Звучит просто, как я полагаю. В редакторе этот предмет можно выкинуть на сцену и добавить нужные эффекты (например, добавление жизней, добавление патронов, отнятие жизни, замедление персонажа). То есть набор эффектов может любым, хоть процедурно генерируй. Однако я вообще не могу догнать, как можно сделать такую логику, что можно использовать за "эффект", чтобы результат был нормальным. Из банального, массив эффектов может просто хранить енумки и потом через switch выполнять нужные действия, но это фигня какая-то. Неплохо было бы вынести логику отработки эффекта в отдельный класс, но тогда в массиве хранить экземпляры классов эффектов? И так для каждого пикапа? Тоже такое себе. То есть, вот на этом этапе я хз, как это можно провернуть. Поэтому буду благодарен за идеи или даже рабочие варианты (вдруг кто-то уже делал подобное, это не выглядит чем-то новым).
да, но если нужен будет предмет, который добавляет здоровье и делает что-то еще, то нужно и для этого отдельный класс писать. Ну и тут уж точно процедурно не сгенерируешь предметы (в плане логических эффектов, которыми они будут влиять на персонажа). и через свитч не хочется. А если менеджером, то он все равно будет перебирать варианты эффектов. Тут разве что хранить в массиве указатели на функции, которые static в классе менеджере. Хотя, вроде не такой плохой вариант
Что значит "делает что-то ещё"? Если боишься кучи свичей, то создай TMap
И что за "логические эффекты"? Можно примеры из существующих игр?
Просто слово "эффект" могут воспринять, как графический эффект.
Да всякие No Man's Sky, Borderland и подобное. Там это к оружию применялось. В духе: огненное замедляющее откидывающее ружье
спасибо
Создаешь ++ эктор(твой пикап объект) в нем массив TArray<UBase_Effect> Effects у массива должно быть UPROPERTY(Instanced) Далее в твоем UBase_Effect(abstract class) делаешь метод Execute(AActor* Actor) Создаешь интерфейс с нужными методами( ChangeHealth(int32 ByValue, ChangeSpeed(int32 ByValue) Реализуешь их своем персонаже Создаешь дочерние классы от UBase_Effect и переопределяешь их метод Execute. UChangeHealth_Effect, UChangeSpeed_Effect Для примера у тебя будет UChangeHealth_Effect class с параметром ChangeHealthByValue - реализация будет { Actor->ChangeHealth(ChangeHealthByValue)) На оверлепе, просто вызываешь для каждого элемента в массиве Effect метод Execute() Если подумать, можно докинуть таймеры на отмену эффектом (т.е. своего рода эффекты с длительностью) и т.п. + можно динамически спавнить свой пикап объект
Годно звучит. Про Instanced и человек выше говорил, я погуглил, но толком не понял его суть в UPROPERTY
Обсуждают сегодня