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