드랍 파츠(전투 중 필드에 떨어지는 파츠 액터) 관련 작업을 한 브랜치에서 진행하고 머지함. 범위: 겹침 방지, 디스폰/바운싱 연출, 상호작용 프롬프트의 스탯 비교 UI, 관련 데이터 캐시.
UNSDroppedPartRegistrySubsystem여러 파츠가 동시에 드랍될 때 같은 자리에 겹쳐 스폰되는 문제를 막기 위해 서버 전용 UWorldSubsystem을 새로 추가.
ANSDroppedPart::BeginPlay/EndPlay에서 자기 자신을 등록/해제 (TWeakObjectPtr 배열로 보관)IsLocationOccupied(Location, AvoidRadius)로 반경 내 기존 드랍 존재 여부를 DistSquared 비교로 체크 (제곱근 계산 회피)사용처 두 곳에서 동일한 패턴(최대 6회 재시도, 실패 시 그냥 진행) 반복:
UNSPartEquipComponent::SpawnDroppedPart — 교체 드랍 시 원래 위치 기준 반경 내에서 각도/거리를 랜덤 지터링해 새 위치 탐색UNSRewardHandler::HandlePartDropResult — 보상 드랍 시 MakeDropLaunchData를 겹치지 않을 때까지 재호출(발사 궤적 자체를 다시 뽑는 방식이라 좌표만 지터링하는 것과 접근이 다름)두 곳 모두 무한루프 방지용으로 시도 횟수를 하드코딩(MaxAttempts = 6)해뒀음 — 나중에 파츠 동시 드랍 개수가 늘어나면 이 상수가 병목이 될 수 있음.
ANSDroppedPart에 시간 기반 자동 정리 + 시각적 생동감 추가:
DespawnDuration 경과 시 FTimerHandle로 자동 Destroy (HandleDespawnTimerExpired)Tick에서 UpdateBobAnimation이 사인파로 메시를 위아래로 흔듦 (BobAmplitude/BobSpeed)SetupVisual에서 계산한 피벗 보정 Z값(MeshBaseRelativeZ)을 기준선으로 삼고 그 위에 오프셋을 더하는 방식 — 그냥 RelativeLocation.Z를 매 틱 덮어쓰면 피벗 보정이 날아가서 이렇게 분리함RingVFXID, DT_VFXDataTable 참조)는 bRingVFXPlayed 플래그로 중복 재생 방지DespawnDuration, BobAmplitude, BobSpeed, RingVFXID)는 코드 기본값이 있지만 FNSDroppedPartConfigRow(DT에 "Default" Row 하나)로 덮어씀 — 밸런스 조정은 DataTable에서, 구조는 C++에서라는 기존 규약 그대로 따름드랍된 파츠를 주우려 할 때, 현재 장착 중인 파츠(없으면 캐릭터 기본 스탯)와 비교해 스탯 변화를 프롬프트에 보여주는 기능 추가.
NSInteractionComponent::UpdateStatComparisonFor(DroppedPart, Widget)가 비교 트리거FNSPartDefinitionRow::StatTag (파츠가 영향 주는 CombatStat.* 태그)와 FNSStatDisplayInfoRow(표시 이름 + bHigherIsBetter)를 매칭해서 값이 오르면 좋은지/내리면 좋은지 판단 후 화살표 색 결정FNSStatDisplayInfoRow는 RowName이 StatTag와 동일해야 조회가 맞게 동작하는 규약 — NSDataSubsystem::FindStatDisplayInfoRow가 이 전제로 캐시 조회NSDataSubsystem에 이 테이블용 캐시(GetCommonStatDisplayInfoTable, FindStatDisplayInfoRow)와 드랍 파츠 설정 캐시(GetDroppedPartConfigRow, BuildDroppedPartConfigCache)를 함께 추가 — 파츠 관련 캐시들을 한 서브시스템에 계속 누적하는 기존 패턴 유지브랜치 뒷부분 커밋(85e8ceba5, 6f90a564c)은 위 기능과 별개로, 상호작용 프롬프트 위젯의 텍스트가 박스 밖으로 삐져나오던 문제를 고정 크기 박스 대신 텍스트 크기에 맞춰 늘어나도록 수정한 것. 스탯 비교 UI 추가로 프롬프트에 표시할 내용이 늘어나면서 드러난 문제로 보임.