[2026_01_08] 버프/디버프 적용 시 실제 적용값(appliedValue) 저장
2026. 1. 8. 21:02ㆍTIL
버프/디버프 적용 시 실제 적용값(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만큼만 제거
}
핵심 교훈
실시간으로 변하는 값에 % 연산을 적용할 때는, 적용 시점의 계산 결과를 저장해야 제거 시 정확하게 복구할 수 있다.
이 패턴은 버프 외에도 임시 스탯 증가, 장비 효과 등 다양한 시스템에 적용 가능합니다.
'TIL' 카테고리의 다른 글
| [2026_01_21] 지휘관 스킬 전역 이벤트 시스템 (0) | 2026.01.21 |
|---|---|
| [2026_01_09] 사운드 고르기... (0) | 2026.01.09 |
| [2026_01_07] Unity UI Mask를 활용한 역마스크(Cutout Mask) (0) | 2026.01.07 |
| [2026_01_06] 비대칭 디버깅(같은 로직인데 한 쪽에서만 작동) (0) | 2026.01.06 |
| [2026_01_02] 중간 발표 (0) | 2026.01.02 |