Table of Contents

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가 비정상적으로 증가)

실습 과제

  1. 임시 버프 Modifier를 추가하고 일정 시간 후 제거해본다.
  2. ExportState/ImportState로 스탯 상태를 저장/복원해본다.

이전 문서 / 다음 문서

이전: 15_EffectSystem.md 다음: 17_TimeSystem.md

관련 API

MCP_Index.md Stat 섹션