[2026_01_08] 버프/디버프 적용 시 실제 적용값(appliedValue) 저장

2026. 1. 8. 21:02TIL

버프/디버프 적용 시 실제 적용값(appliedValue) 저장 시스템

문제 상황

 
csharp
// 문제: Percent 버프 제거 시 값이 정확하게 복구되지 않음
1. 공격력 100인 유닛에 20% 버프 적용 → 100 + (100 × 0.2) = 120
2. 다른 버프로 공격력이 130이 됨
3. 첫 번째 버프 제거: 130 - (130 × 0.2) = 104  (100이 되어야 함)

해결 방법

적용할 때 실제로 증가/감소한 델타값을 저장

 
csharp
public class StatusEffectData
{
    public float appliedValue;  // 실제로 적용된 값 저장
}

private void AddBuffValue(StatusEffectData effect)
{
    float delta;
    if (valueType == Percent)
        delta = owner.CurAtk * (value / 100f);  // 20 계산
    else
        delta = value;
    
    owner.ModifyAtk(delta);
    effect.appliedValue = delta;  // 20 저장!
}

private void RemoveBuffValue(StatusEffectData effect)
{
    float appliedValue = effect.appliedValue;  // 저장된 20 사용
    owner.ModifyAtk(-appliedValue);  // 정확히 20만큼만 제거
}

핵심 교훈

실시간으로 변하는 값에 % 연산을 적용할 때는, 적용 시점의 계산 결과를 저장해야 제거 시 정확하게 복구할 수 있다.

이 패턴은 버프 외에도 임시 스탯 증가, 장비 효과 등 다양한 시스템에 적용 가능합니다.