TIL - 드롭파츠 디스폰 및 위젯 수정

Kyu_·2026년 7월 13일

34주차

목록 보기
1/4

TIL

드랍 파츠(전투 중 필드에 떨어지는 파츠 액터) 관련 작업을 한 브랜치에서 진행하고 머지함. 범위: 겹침 방지, 디스폰/바운싱 연출, 상호작용 프롬프트의 스탯 비교 UI, 관련 데이터 캐시.

1. 드랍 파츠 겹침 방지 — UNSDroppedPartRegistrySubsystem

여러 파츠가 동시에 드랍될 때 같은 자리에 겹쳐 스폰되는 문제를 막기 위해 서버 전용 UWorldSubsystem을 새로 추가.

  • ANSDroppedPart::BeginPlay/EndPlay에서 자기 자신을 등록/해제 (TWeakObjectPtr 배열로 보관)
  • IsLocationOccupied(Location, AvoidRadius)로 반경 내 기존 드랍 존재 여부를 DistSquared 비교로 체크 (제곱근 계산 회피)
  • 중요: 이 레지스트리는 리플리케이션/가시성과 완전히 무관한 "서버 내부 참고용 북키핑"일 뿐. 파츠 액터 자체는 기존처럼 모든 클라에 복제됨. 서브시스템은 스폰 위치 결정 로직에서만 쓰임

사용처 두 곳에서 동일한 패턴(최대 6회 재시도, 실패 시 그냥 진행) 반복:

  • UNSPartEquipComponent::SpawnDroppedPart — 교체 드랍 시 원래 위치 기준 반경 내에서 각도/거리를 랜덤 지터링해 새 위치 탐색
  • UNSRewardHandler::HandlePartDropResult — 보상 드랍 시 MakeDropLaunchData를 겹치지 않을 때까지 재호출(발사 궤적 자체를 다시 뽑는 방식이라 좌표만 지터링하는 것과 접근이 다름)

두 곳 모두 무한루프 방지용으로 시도 횟수를 하드코딩(MaxAttempts = 6)해뒀음 — 나중에 파츠 동시 드랍 개수가 늘어나면 이 상수가 병목이 될 수 있음.

2. 드랍 파츠 디스폰/바운싱 연출

ANSDroppedPart에 시간 기반 자동 정리 + 시각적 생동감 추가:

  • DespawnDuration 경과 시 FTimerHandle로 자동 Destroy (HandleDespawnTimerExpired)
  • 착지 후 Tick에서 UpdateBobAnimation이 사인파로 메시를 위아래로 흔듦 (BobAmplitude/BobSpeed)
    • SetupVisual에서 계산한 피벗 보정 Z값(MeshBaseRelativeZ)을 기준선으로 삼고 그 위에 오프셋을 더하는 방식 — 그냥 RelativeLocation.Z를 매 틱 덮어쓰면 피벗 보정이 날아가서 이렇게 분리함
  • 파츠를 감싸는 링 VFX(RingVFXID, DT_VFXDataTable 참조)는 bRingVFXPlayed 플래그로 중복 재생 방지
  • 위 세 수치(DespawnDuration, BobAmplitude, BobSpeed, RingVFXID)는 코드 기본값이 있지만 FNSDroppedPartConfigRow(DT에 "Default" Row 하나)로 덮어씀 — 밸런스 조정은 DataTable에서, 구조는 C++에서라는 기존 규약 그대로 따름

3. 상호작용 프롬프트 스탯 비교 UI

드랍된 파츠를 주우려 할 때, 현재 장착 중인 파츠(없으면 캐릭터 기본 스탯)와 비교해 스탯 변화를 프롬프트에 보여주는 기능 추가.

  • NSInteractionComponent::UpdateStatComparisonFor(DroppedPart, Widget)가 비교 트리거
  • FNSPartDefinitionRow::StatTag (파츠가 영향 주는 CombatStat.* 태그)와 FNSStatDisplayInfoRow(표시 이름 + bHigherIsBetter)를 매칭해서 값이 오르면 좋은지/내리면 좋은지 판단 후 화살표 색 결정
  • FNSStatDisplayInfoRowRowName이 StatTag와 동일해야 조회가 맞게 동작하는 규약 — NSDataSubsystem::FindStatDisplayInfoRow가 이 전제로 캐시 조회
  • NSDataSubsystem에 이 테이블용 캐시(GetCommonStatDisplayInfoTable, FindStatDisplayInfoRow)와 드랍 파츠 설정 캐시(GetDroppedPartConfigRow, BuildDroppedPartConfigCache)를 함께 추가 — 파츠 관련 캐시들을 한 서브시스템에 계속 누적하는 기존 패턴 유지

4. WBP 텍스트 크기 버그 (뒤늦게 수정된 커밋 2개)

브랜치 뒷부분 커밋(85e8ceba5, 6f90a564c)은 위 기능과 별개로, 상호작용 프롬프트 위젯의 텍스트가 박스 밖으로 삐져나오던 문제를 고정 크기 박스 대신 텍스트 크기에 맞춰 늘어나도록 수정한 것. 스탯 비교 UI 추가로 프롬프트에 표시할 내용이 늘어나면서 드러난 문제로 보임.

0개의 댓글