인 런 진입 전 거점에서 파츠를 미리 선택·장착할 수 있게 한다.
CommonCurrency)를 소모해 개별 파츠를 언락(구매)TSoftObjectPtr<UNSPartDefinition> 그대로 → 세이브 마이그레이션 없음ApplyEquippedPart)로 적용FNSPartDefinitionRow : FTableRowBase (DT_PartDefinition)카탈로그의 유일한 수치 출처. 파츠 1개 = row 1개.
| 필드 | 타입 | 설명 |
|---|---|---|
Definition | TSoftObjectPtr<UNSPartDefinition> | DA 참조 (정체성 앵커) |
PartSlot | ENSPartSlot | Body / Arm / Leg |
bCanReroll | bool | 레그 파츠는 false |
UnlockCost | int64 | 언락(구매) 영구재화 비용 |
ValueRange | TMap<ENSPartRarity, FNSPartValueRange> | 등급별 수치 범위 (DA에서 이사) |
bEnabled | bool | false면 카탈로그에서 제외 (증강 패턴) |
UNSPartDefinition 변경 (얇아짐)DA에서 DT로 이사하는 필드: ValueRange, bCanReroll, PartSlot
DA에 남는 필드 (PrimaryAsset·번들 로드 앵커로 유지):
| 필드 | 번들 |
|---|---|
PartName (FText) | — |
Icon (TSoftObjectPtr\<UTexture2D>) | OutRunUI, InRunUI |
PartMesh (TSoftObjectPtr\<USkeletalMesh>) | 온디맨드 |
EffectClass (TSoftClassPtr\<UGameplayEffect>) | InRunData |
GrantedAbilities (TArray\<TSoftClassPtr\<UGameplayAbility>>) | InRunData |
PartIconTool은 DA의 PartMesh → Icon 경로를 그대로 사용하므로 수정 없음.
NSDataSubsystemUPROPERTY(EditDefaultsOnly)
TObjectPtr<UDataTable> PartDefinitionTable; // DT_PartDefinition 참조
TMap<FPrimaryAssetId, FNSPartDefinitionRow> CachedPartRowsByDefId; // 로드 시 빌드
LoadOutGameAssets) PartAssetType DA 로드 완료 콜백에서 row 캐시 빌드GetPartRow(FPrimaryAssetId) → const FNSPartDefinitionRow* 조회 함수 추가NSPartUtils기존 ResolvePartDefinition(WorldCtx, PartData) 유지.
신규 ResolvePartRow(WorldCtx, FPrimaryAssetId) → const FNSPartDefinitionRow* 추가.
[UI: 언락 버튼 클릭]
→ ProgressionSubsystem::PurchasePart(Def, Common, Cost)
← Cost는 UI가 직접 넘기지 않음
← NSDataSubsystem::GetPartRow(DefId).UnlockCost 에서 조회 (단일 출처)
→ CommonCurrency 차감
→ OwnedParts 에 FNSPartSaveData 추가 (Value 1회 롤 후 고정)
→ SaveNow()
PurchasePart 수정 포인트:
LoadSynchronous 제거 — ValueRange를 DT row에서 읽으므로 DA 로드 불필요[UI: 장착 버튼 클릭]
→ ProgressionSubsystem::SetEquippedPart(CharacterId, Def, Common)
→ IsPartOwned 검증
→ FNSCharacterSaveData.EquippedPartDefinition / Rarity 갱신
→ SaveNow()
Server_RequestEquip (인런 GAS 즉시 장착 경로) 호출 제거NSPartEquipWidget)| 현재 (잘못된 경로) | 변경 후 (아웃런 경로) |
|---|---|
SelectableParts 정적 배열 | DT_PartDefinition rows (bEnabled=true) |
Server_RequestEquip (인런 GAS) | PurchasePart + SetEquippedPart (영구 저장) |
| Common 고정 직접 생성 | row의 ValueRange[Common] 범위로 Value 롤 |
UI 표시 항목 (row + OwnedParts 상태 결합):
변경 없음. 기존 경로 그대로.
NSPlayerController::Server_UploadProgress
→ OwnedParts에서 EquippedPartDefinition + Rarity로 FNSPartSaveData 해석
→ Payload.EquippedPart 설정
→ Client_SaveProgress / ApplyEquippedPart()