PART 3 - 강의 1/4
Duration과 Modifier
GameplayEffect의 지속 시간과 수정자 연산
01
Duration Policy
이펙트 지속 시간 유형
EGameplayEffectDurationType
UENUM()
enum class EGameplayEffectDurationType : uint8
{
// 즉시 적용되고 사라짐 - BaseValue 수정
Instant,
// 일정 시간 동안 지속 - CurrentValue 수정
HasDuration,
// 무한 지속 (수동 제거 필요) - CurrentValue 수정
Infinite
};
| 타입 | 수정 대상 | 사용 예 |
|---|---|---|
| Instant | BaseValue | 데미지, 힐링, 영구 스탯 변경 |
| HasDuration | CurrentValue | 일시 버프, DoT, 디버프 |
| Infinite | CurrentValue | 장비 보너스, 패시브 효과 |
02
Modifier Operation
어트리뷰트 수정 연산 종류
EGameplayModOp
UENUM()
enum class EGameplayModOp : uint8
{
Additive, // + 연산 (BaseValue에 더함)
Multiplicitive, // * 연산 (곱셈)
Division, // / 연산 (나눗셈)
Override, // 덮어쓰기 (가장 먼저 적용)
Max // 최대값 비교
};
// 최종 값 계산 공식:
// FinalValue = (BaseValue + SumOfAdditive) * ProductOfMultiplicative / ProductOfDivision
// 예시: BaseValue = 100
// Additive +20, +10 -> (100 + 20 + 10) = 130
// Multiplicative *1.2, *1.1 -> 130 * 1.2 * 1.1 = 171.6
연산 순서
1. Override (먼저 처리) -> 2. Additive -> 3. Multiplicative -> 4. Division 순서로 적용됩니다. Override가 있으면 다른 Modifier는 무시됩니다.
03
Modifier Magnitude 유형
Modifier 값 결정 방식
Scalable Float
기본 값 + Curve Table 스케일링. 레벨에 따른 값 변화에 적합.
Attribute Based
다른 어트리뷰트 값 참조. 예: 공격력의 10%만큼 체력 회복
SetByCaller
런타임에 동적으로 값 설정. GameplayTag로 값 식별.
Custom Calculation
MMC 클래스로 복잡한 계산. C++/Blueprint 구현.
SetByCaller 사용 예
// 어빌리티에서 SetByCaller 값 설정
FGameplayEffectSpecHandle DamageSpec = MakeOutgoingGameplayEffectSpec(
DamageEffectClass, GetAbilityLevel());
// 태그로 값 식별
DamageSpec.Data->SetSetByCallerMagnitude(
FGameplayTag::RequestGameplayTag(FName("Data.Damage.Base")),
100.0f // 데미지 값
);
// 타겟에 적용
ApplyGameplayEffectSpecToTarget(...);
04
Period와 Periodic Effect
주기적으로 반복 적용되는 이펙트
Periodic Effect 설정
// GameplayEffect Blueprint에서 설정:
// Duration Policy: HasDuration (예: 10초)
// Period: 1.0 (매 1초마다 적용)
// Execute Periodic Effect on Application: true
// 결과: 10초 동안 매 1초마다 Modifier 적용
// 총 10회 적용 (0초, 1초, 2초, ... 9초)
// DoT 데미지 예시:
// - Duration: 5초
// - Period: 0.5초
// - Modifier: Health -10 (Additive)
// -> 총 50 데미지 (10회 * -5)
Periodic Effect 예측 불가
Periodic Effect는 클라이언트 예측이 불가능합니다. 서버에서만 Period 타이밍이 처리되며, 결과가 클라이언트에 복제됩니다.
SUMMARY
핵심 요약
- Duration: Instant(BaseValue), HasDuration/Infinite(CurrentValue)
- Modifier 연산: Override -> Additive -> Multiplicative -> Division
- Magnitude 유형: Scalable Float, Attribute Based, SetByCaller, Custom Calculation
- Periodic Effect로 DoT/HoT 구현 (예측 불가)
- 복잡한 계산은 Custom Calculation (MMC) 사용
PRACTICE
도전 과제
배운 내용을 직접 실습해보세요
실습 1: Duration GE 구현
HasDuration GE를 만들어 5초간 이동속도를 30% 증가시키는 버프를 구현하세요. DurationPolicy를 HasDuration으로, DurationMagnitude를 ScalableFloat로 설정하세요.
실습 2: Modifier 조합
Additive, Multiplicative, Override 3가지 ModifierOp을 사용한 GE를 각각 만들고, 동일 어트리뷰트에 동시 적용 시 연산 순서(Add->Multiply->Override)를 확인하세요.
심화 과제
undefined