TPS 개발 : 무기 업그레이드 — GE 패시브와 캐싱
무기별 업그레이드를 Infinite GE로 구현하고, 스왑 시 캐싱된 업글을 한 번에 재적용하는 패시브 구조
TPS 개발 - 무기 업그레이드
무기 업그레이드를 구현했다. 업그레이드 Definition으로 얼개는 잡아뒀으니, 오늘은 여기에 실제 수치를 붙이는 게 목표였다.
GE로 어트리뷰트를 영구히 올리기
업그레이드는 GameplayEffect 형태로 개발했다. 총기별, 총기 모드별로 업그레이드를 구매하면 데미지·공격속도·장전속도 같은 어트리뷰트셋을 Infinite Duration으로 올려주는 방식이다.
1
2
3
업그레이드 구매
└─ 해당 무기/모드용 GE 생성 (Duration: Infinite)
└─ ASC에 Apply → 어트리뷰트 영구 상승
Infinite로 가는 이유는 단순하다. 업그레이드는 한 번 사면 계속 유지돼야 하는 성질이라, 예전에 정리한 Duration 개념 그대로 “명시적으로 제거되기 전까진 유지”가 딱 맞았다.
문제 — 무기마다 다른 업글을 어떻게 들고 있나
총기가 여러 개고, 총기마다 모드(예: 싱글/버스트)도 여러 개다. 각 조합마다 업그레이드 현황이 따로 존재해야 한다.
그런데 GE는 ASC에 적용된 순간 그 무기에 종속되지 않는다. ASC 하나에 여러 무기의 GE가 막 뒤섞여 있으면, 스왑했을 때 지금 든 무기와 무관한 GE까지 같이 영향을 준다.
해결 — 업글 현황 캐싱 + 스왑 시 일괄 적용
그래서 패시브 방식으로 갔다.
- 종류별(무기별·모드별) 업그레이드 현황을 캐싱해서 들고 있는다.
- 실제 GE는 ASC에 상시 적용하지 않는다.
- 스왑을 하는 순간, 그 무기에 해당하는 캐싱된 업글 GE들을 한 번에 적용한다.
1
2
3
4
5
6
무기 A 업그레이드 구매
└─ GE 적용 X, "무기A 업글 현황"에 캐싱만
무기 B로 스왑
└─ 무기A GE 전부 Remove
└─ 캐싱된 "무기B 업글 현황"의 GE들 한 번에 Apply
이렇게 하면 지금 손에 든 무기의 업그레이드만 어트리뷰트에 반영되고, 다른 무기 업글은 캐시에 잠들어 있다가 그 무기를 다시 들 때 살아난다.
덮어쓰기 대신 임시값을 선택한 이유
어트리뷰트셋 값을 아예 덮어쓸까도 고민했다. 하지만 우리 무기 업글은 Base 값에서 5% → 10% → 15% → 20% → 25%씩 증가하는 방식이다.
값을 덮어쓰는 구조로 가면, 매 단계 적용 순서나 계산 방식에 따라 복리식으로 데미지가 뻥튀기될 위험이 있었다. (예: 5% 증가 위에 다시 10% 증가를 곱연산으로 태우면 의도한 수치보다 훨씬 커짐.)
이 리스크를 검증 없이 프로덕션 코드에 박기엔 이르다고 판단해서, 우선은 임시값을 붙이는 선에서 정리했다. 정확한 가산/곱연산 방식은 나중에 밸런스를 보면서 확정하기로 했다.
오늘 정리
- 무기 업그레이드는 Infinite GE로 어트리뷰트 영구 상승
- 무기/모드별 업글 현황은 캐싱해두고, 실제 GE는 적용 안 함
- 스왑 시점에 캐싱된 GE들을 한 번에 Apply하는 패시브 구조
- 5/10/15/20/25% 증가 방식이라 덮어쓰기 = 복리 뻥튀기 위험 → 당장은 임시값으로 우회