MiddleДизайнЧастоЕщё не отвечали
Вы наделяете персонажа игрока здоровьем, маной и стаминой через плагин системы способностей Unreal GAS. У каждого стата есть текущее и максимальное значение, он должен оставаться в допустимом диапазоне и управляться геймплеем — получение урона, трата маны на каст, расход и регенерация стамины. Реализация должна чисто работать с репликацией и быть переиспользуемой и для персонажей под управлением ИИ. Опишите, как вы смоделируете и будете менять эти статы в GAS. Требования: статы живут в собственном контейнере данных фреймворка, а не в произвольных переменных; значения остаются ограниченными на каждом пути кода, который их меняет; все изменения идут через систему эффектов фреймворка, а не прямым присваиванием; а входящий урон маршрутизируется так, чтобы здоровье уменьшалось безопасно, а не записывалось напрямую.
Определите UAttributeSet с текущими и макс. значениями каждого стата, разместите его на ASC, ограничивайте в PreAttributeChange/PostGameplayEffectExecute и меняйте значения только через GameplayEffects с мета-атрибутом Damage.
- ✗Применять чистый урон прямо к Health вместо маршрутизации через мета-атрибут
Damage - ✗Ограничивать только в
PreAttributeChange, пропуская исполняемыеInstant-эффекты - ✗Реплицировать атрибуты вручную вместо того, чтобы доверить это AttributeSet
- →Как добавить регенерацию стамины, которая ставится на паузу во время бега?
- →Где бы вы транслировали событие смерти, когда Health достигает нуля?
Оглавление
Архитектура
Какие части GAS задействованы
UAttributeSet— один наборUCharacterAttributeSetсHealth/MaxHealth,Mana/MaxMana,Stamina/MaxStaminaи мета-атрибутомDamage.UAbilitySystemComponent(ASC) — владеет набором, хранит и реплицирует атрибуты.- GameplayEffects — все изменения статов: урон, лечение, регенерация, стоимость способностей.
- GameplayTags —
State.Dead,State.Sprintingдля гейтинга.
Поток данных
Способность → CommitAbility (стоимость = Instant GE по Mana/Stamina)
→ урон: Instant GE задаёт мета-атрибут Damage
PostGameplayEffectExecute: Damage → Health -= Damage, Damage обнуляется
PreAttributeChange / PostGameplayEffectExecute: clamp 0..Max
Регенерация: Infinite GE с Periodic Modifier по Stamina/Mana
Ключевые точки реализации
- Объявляйте атрибуты через
ATTRIBUTE_ACCESSORS, помечайтеReplicatedUsing. - Мета-атрибут
Damageне реплицируется — он временный буфер, обрабатываемый на сервере. - В
PostGameplayEffectExecuteчитайтеData.EvaluatedData.Attribute, переноситеDamageвHealth, ограничивайте диапазон. - Регенерацию стамины ставьте на паузу, добавляя/снимая Infinite GE по тегу
State.Sprinting.
Компромиссы
- Плюсы: изменения данными, бесплатная репликация, готовность к предсказанию, переиспользование для ИИ.
- Минусы: больше стартового кода, чем у простых
float; кривая обучения; отладка через GE сложнее, чем прямое присваивание.
Оглавление