16. StatSystem
왜 필요한가
공격력/체력 같은 스탯에 버프/장비 보정치가 겹겹이 쌓이는 로직을 직접 구현하면 계산 순서 버그가 잦다. StatSystem은 Modifier 스택과 재계산을 표준화한다.
언제 사용하는가
캐릭터 스탯 조회/수정, 장비/버프로 인한 일시적 수치 변경이 필요할 때.
프로젝트에서 어떤 역할인가
AddModifier/RemoveAllModifiers로 수정치를 쌓고, GetValue/TryGetValue로 최종값을 읽는다. ExportState/ImportState로 저장/복원한다 (구 명칭 TakeSnapshot/RestoreSnapshot에서 변경됨). Stat.ActiveRuntimeStatCount/ActiveModifierCount/DirtyStatCount/RecalculateCount를 Diagnostics에 등록한다.
실제 게임에서는 언제 호출되는가
장비 착용 시 AddModifier, 저장 시 ExportState, 불러오기 시 ImportState.
코드 예제
[Inject] private IStatSystem _stat;
_stat.AddModifier(entityId, "Attack", new StatModifier(+10, ModifierType.Flat));
float atk = _stat.GetValue(entityId, "Attack");
var state = _stat.ExportState(entityId);
관련 Sample
Samples/Stat/StatSystemSample.cs
Best Practice
값 변경 알림이 필요하면 Subscribe로 구독하고, 매 프레임 폴링하지 않는다.
자주 하는 실수
TakeSnapshot/RestoreSnapshot같은 옛 이름을 찾음 (현재는ExportState/ImportState)- Modifier를 제거하지 않고 계속 누적 (
DirtyStatCount가 비정상적으로 증가)
실습 과제
- 임시 버프 Modifier를 추가하고 일정 시간 후 제거해본다.
ExportState/ImportState로 스탯 상태를 저장/복원해본다.
이전 문서 / 다음 문서
이전: 15_EffectSystem.md 다음: 17_TimeSystem.md
관련 API
MCP_Index.md Stat 섹션