PART 3 - 강의 2/4

Modifier Magnitude Calculation

커스텀 계산 클래스로 복잡한 Modifier 구현

01

MMC란?

Modifier Magnitude Calculation 클래스

MMC (Modifier Magnitude Calculation)는 단일 float 값을 반환하는 커스텀 계산 클래스입니다. 여러 어트리뷰트를 참조하여 복잡한 공식으로 Modifier 값을 계산할 수 있습니다.

MMC 특징
  • 예측 가능 - Execution Calculation과 달리 클라이언트 예측 지원
  • 단일 값 반환 - 하나의 float만 반환
  • 어트리뷰트 캡처 - Source/Target의 어트리뷰트 참조
  • Blueprint 확장 가능 - C++와 BP 모두 지원
02

MMC 구현

어트리뷰트 캡처와 계산 로직

MMC 클래스 정의 UCLASS() class UMyDamageMMC : public UGameplayModMagnitudeCalculation { GENERATED_BODY() public: UMyDamageMMC(); virtual float CalculateBaseMagnitude_Implementation( const FGameplayEffectSpec& Spec) const override; private: // 캡처할 어트리뷰트 정의 FGameplayEffectAttributeCaptureDefinition AttackPowerDef; FGameplayEffectAttributeCaptureDefinition CritChanceDef; };
MMC 생성자 - 어트리뷰트 캡처 설정 UMyDamageMMC::UMyDamageMMC() { // 소스의 AttackPower 캡처 AttackPowerDef.AttributeToCapture = UCombatAttributeSet::GetAttackPowerAttribute(); AttackPowerDef.AttributeSource = EGameplayEffectAttributeCaptureSource::Source; AttackPowerDef.bSnapshot = false; // 적용 시점 값 사용 // 소스의 CritChance 캡처 CritChanceDef.AttributeToCapture = UCombatAttributeSet::GetCritChanceAttribute(); CritChanceDef.AttributeSource = EGameplayEffectAttributeCaptureSource::Source; CritChanceDef.bSnapshot = false; // 반드시 RelevantAttributesToCapture에 추가! RelevantAttributesToCapture.Add(AttackPowerDef); RelevantAttributesToCapture.Add(CritChanceDef); }
MMC 계산 구현 float UMyDamageMMC::CalculateBaseMagnitude_Implementation( const FGameplayEffectSpec& Spec) const { // 소스와 타겟 태그 가져오기 const FGameplayTagContainer* SourceTags = Spec.CapturedSourceTags.GetAggregatedTags(); const FGameplayTagContainer* TargetTags = Spec.CapturedTargetTags.GetAggregatedTags(); FAggregatorEvaluateParameters EvaluationParameters; EvaluationParameters.SourceTags = SourceTags; EvaluationParameters.TargetTags = TargetTags; // 어트리뷰트 값 가져오기 float AttackPower = 0.f; GetCapturedAttributeMagnitude( AttackPowerDef, Spec, EvaluationParameters, AttackPower); float CritChance = 0.f; GetCapturedAttributeMagnitude( CritChanceDef, Spec, EvaluationParameters, CritChance); // 크리티컬 계산 float FinalDamage = AttackPower; if (FMath::FRand() < CritChance) { FinalDamage *= 2.0f; // 크리티컬 배율 } return FinalDamage; }
03

Snapshot vs Non-Snapshot

어트리뷰트 캡처 시점 선택

옵션 bSnapshot = true bSnapshot = false
캡처 시점 GE Spec 생성 시 GE 적용 시
사용 사례 발사체 데미지 (발사 시점 스탯) 근접 공격 (적중 시점 스탯)
버프 반영 Spec 생성 후 버프 무시 적용 직전 버프 반영
Snapshot 사용 가이드

발사체처럼 Spec 생성과 적용 사이에 시간이 있는 경우 bSnapshot = true를 사용하세요. 즉시 적용되는 효과는 false가 일반적입니다.

04

GameplayEffect에서 MMC 사용

Blueprint에서 MMC 연결

Blueprint 설정 // GameplayEffect Blueprint에서: // 1. Modifier 추가 // Attribute: IncomingDamage // Modifier Op: Additive // Modifier Magnitude: Custom Calculation Class // 2. Calculation Class 선택 // Magnitude Calculation Type: Custom Calculation Class // Calculation Class: MyDamageMMC // 3. (선택) Coefficient 추가 // Coefficient: 1.0 (MMC 결과에 곱함) // Pre/Post Multiply Additive Value: 0.0 (가감)
최종 값 계산
  • FinalMagnitude = (MMCResult * Coefficient) + PreMultiplyAdditiveValue
  • 또는 (MMCResult + PostMultiplyAdditiveValue) * Coefficient
SUMMARY

핵심 요약

  • MMC: 예측 가능한 커스텀 Magnitude 계산 클래스
  • RelevantAttributesToCapture에 캡처할 어트리뷰트 등록 필수
  • bSnapshot: true=Spec 생성 시, false=적용 시 값 사용
  • GetCapturedAttributeMagnitude()로 어트리뷰트 값 조회
  • Blueprint에서 Custom Calculation Class로 MMC 지정
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: ScalableFloat Curve Table

UCurveTable을 생성하고 스킬 레벨에 따라 데미지가 증가하는 ScalableFloat를 설정하세요. GE의 ModifierMagnitude에서 ScalableFloat를 참조하세요.

실습 2: Custom MMC 구현

UGameplayModMagnitudeCalculation을 상속하여 소스의 AttackPower와 타겟의 Defense를 참조하는 커스텀 데미지 공식을 구현하세요.

심화 과제

undefined