콘텐츠로 이동
GameDesign

인벤토리 / 창고 작성완료구현밸런싱미완료

플레이어 자산을 담는 휴대 인벤토리·창고, 그리고 그 안에서 장비를 꺼내 입는 장착 슬롯의 구조와 운영을 정의한다. 익스트랙션 게임에서 “무엇을 들고 들어가고, 무엇을 두고 나오는가”의 의사결정 무대다.

flowchart LR
subgraph LOBBY [🏠 로비]
  PREP[🎒 출정 전 준비<br/>창고 → 휴대 + 장착]
end
subgraph RUNZONE [⚔️ 런 중]
  RUN[루팅 · 전투]
  WEIGHT[⚖️ 무게 증가<br/>이동·구르기·질주 둔화]
end
subgraph RESULT [🎯 정산]
  DECIDE{탈출 시도}
  KEEP[✅ 휴대 보존<br/>로비에서 창고로]
  LOSE[💀 휴대 전부 손실<br/>창고만 유지]
end

PREP --> RUN --> WEIGHT --> DECIDE
DECIDE -->|성공| KEEP
DECIDE -->|사망·시간 초과·포기| LOSE

classDef prep fill:#e0f2fe,stroke:#0284c7,stroke-width:2px,color:#075985
classDef run fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f
classDef weight fill:#fed7aa,stroke:#ea580c,stroke-width:2px,color:#7c2d12
classDef decide fill:#e9d5ff,stroke:#9333ea,stroke-width:2.5px,color:#581c87
classDef ok fill:#bbf7d0,stroke:#16a34a,stroke-width:2.5px,color:#14532d
classDef ng fill:#fecaca,stroke:#dc2626,stroke-width:2.5px,color:#7f1d1d
class PREP prep
class RUN run
class WEIGHT weight
class DECIDE decide
class KEEP ok
class LOSE ng
linkStyle 3 stroke:#16a34a,stroke-width:3px
linkStyle 4 stroke:#dc2626,stroke-width:3px
원칙규칙의미
공간 관리가 선택을 만든다행×열 격자, 아이템마다 sizeX × sizeY 점유무엇을 가져갈지 매번 결정해야 한다
런 자산과 장기 자산을 분리한다휴대(런용)와 창고(거점용)는 별개 컨테이너탈출 성공/실패의 보상 차이를 만든다
배치 숙련도를 허용한다90도 회전(isRotate)으로 칸 모양 변경 가능잘 배치하면 같은 공간에 더 많이 담는다
장착 판단과 보관 판단을 분리한다격자 칸과 장착 슬롯은 별도 영역무기·방어구의 “지금 쓸 것”과 “들고 갈 것”을 따로 본다
많이 가져갈수록 행동 리스크가 커진다휴대 무게가 이동·구르기·질주 성능에 영향욕심과 생존 사이의 트레이드오프
사건휴대 인벤토리창고
탈출 성공전부 보존 → 로비에서 창고로 옮길 수 있음변동 없음
사망전부 손실 (시작 빈 인벤토리로 복귀)변동 없음
탈출 실패 (시간 초과·자발적 포기 포함)전부 손실변동 없음

장착 슬롯에 올라가 있던 아이템도 휴대 안에 있는 것으로 취급된다 — 사망 시 같이 손실.

런에 들고 들어가는 자산을 담는 그리드 컨테이너다. 플레이어는 제한된 칸 안에서 “무엇을 가져갈지 — 무엇을 더 줍고 무엇을 버릴지 — 지금 탈출할지”를 매 순간 판단한다.

항목
기본 격자 크기6행 × 10열 = 60칸
운영 방식시트로 관리. 캐릭터 클래스·메타 성장·미션으로 확장 가능.
초기 화폐캐릭터 생성 시 부여 (playerMoney). 화폐도 1칸 스택형 아이템으로 인벤토리에 함께 보관.
보존탈출 성공 → 유지 / 사망·실패 → 전부 손실 + 빈 인벤토리로 복귀

Bag 슬롯에 가방을 장착하면 격자가 추가로 늘어난다 (BagTableData.extraSlotRowColumn).

로비 거점에 두는 자산을 담는 영구 보관소다. 휴대보다 약 3배 넓다.

항목
기본 격자 크기19행 × 10열 = 190칸
위치로비의 주막 안 창고 (NPC: 주막 아줌마)
접근Storage 오브젝트 상호작용 ([F]) — 로비에서만
보존런 결과와 무관하게 항상 유지

격자 크기는 시트로 관리하며 클래스·메타 진행으로 확장 가능.

flowchart LR
subgraph LOBBY [🏠 로비]
  L[로비 거점]
  S[📦 창고<br/>19×10=190칸]
end
subgraph CARRY [🎒 휴대 영역]
  P[휴대 인벤토리<br/>6×10=60칸]
end
subgraph RUNZONE [⚔️ 런]
  R[런]
end
subgraph RESULT [🎯 종료]
  K[✅ 자산 보존]
  X[💀 휴대 전체 손실]
end

L --> S
L --> P
S <-->|로비에서 자유 이동| P
P -->|런 진입| R
R -->|루팅으로 추가| P
R -->|탈출 성공| K
R -->|사망·실패| X
K --> P
X --> P

classDef lobby fill:#e0f2fe,stroke:#0284c7,stroke-width:2px,color:#075985
classDef store fill:#dbeafe,stroke:#1d4ed8,stroke-width:2px,color:#1e3a8a
classDef carry fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#78350f
classDef run fill:#fed7aa,stroke:#ea580c,stroke-width:2px,color:#7c2d12
classDef ok fill:#bbf7d0,stroke:#16a34a,stroke-width:2.5px,color:#14532d
classDef ng fill:#fecaca,stroke:#dc2626,stroke-width:2.5px,color:#7f1d1d
class L lobby
class S store
class P carry
class R run
class K ok
class X ng
linkStyle 5 stroke:#16a34a,stroke-width:3px
linkStyle 6 stroke:#dc2626,stroke-width:3px
  • 로비에 있을 때 휴대 ↔ 창고 자유 이동.
  • 런 중에는 휴대만 접근 가능. 창고는 닫혀 있음.

각 아이템은 다음 데이터로 격자에 배치된다.

필드의미
sizeX, sizeY아이템 원본 칸 크기
coordinateX, coordinateY격자 위 좌상단 좌표
isRotate90도 회전 적용 여부 (모든 아이템 회전 가능)
count동일 아이템 누적 개수 (스택형)
stack한 칸이 담을 수 있는 최대 스택

운영 상태는 세 가지 리스트로 관리된다.

리스트의미
ItemUIInfos격자에 확정된 아이템
DummyItemUIInfos드래그·임시 배치 중인 아이템
VirtualItemUIInfos빈칸 찾기 등 가상 계산용

드래그 시작 → Dummy 등록 → 드롭 위치 결정 → Settle → ItemUI로 이전.

장착 슬롯은 격자 칸과 분리된 부위별 슬롯이다. 14종.

슬롯받는 아이템동시 장착 수
HeadHead1
TorsoTorso1
HandsHands1
LegsLegs1
FeetFeet1
BeltBelt1
NeckAmulet1
Ring1Ring1
Ring2Ring1
RightHandWeapon 또는 Shield1
LeftHandWeapon 또는 Shield1
BagBag1
PartsParts (Main/Sub)무기에 종속
QuickUtility 위주Belt.slotCount만큼

양손 무기는 RightHand 한 슬롯만 점유하고 LeftHand는 비어 있는 상태로 표시된다. 이도류(좌우 무기 동시) 도입 여부는 추후 결정.

Ring1·Ring2 분리. 반지 2개 동시 장착 가능.

  • 단축키로 빠르게 사용. 주 용도는 Utility(포션 등).
  • 슬롯 수는 장착한 벨트(BeltTableData.slotCount)가 결정.
  • 단축키 현재 매핑: 숫자키 1~5 (추후 돌리기형 휠 검토).
  • 쿨다운: 공용 쿨다운(예: 0.5~1.0초 다른 Quick 사용 잠금) + 아이템 개별 쿨다운. UtilityTableData.preDelay로 캐스팅 시간 별도 적용.

가져가는 양과 행동 자유도의 트레이드오프를 만드는 시스템.

영향메커니즘
이동속도최종 이동속도 = 기본속도 × Ml(r) × 지형감속 (r = 착용무게/최대중량)
구르기무게 증가 → 무적 시간 감소 / 앞뒤 시간 증가
질주이동속도 기반이라 무게가 늦으면 질주도 느림
생존 자원과적 상태에서 Hunger·Thirst가 더 빨리 감소
CW = CW_Base + F_dh(STR) + F_dh(VIT)
의미
CW_Base기본 중량 한도 (기본 200)
F_dh(STR)근력에 따른 한도 증가 (Δ-더블 힐)
F_dh(VIT)체력에 따른 한도 증가 (Δ-더블 힐)
구간효과
r ≤ 1 (한도 이하)가벼울수록 보너스. 최대 ×1.10
r > 1 (한도 초과)무거울수록 감속. 바닥 ×0.35

코드 기본 파라미터: mMin = 0.35, mMax = 1.10, p = 6 (좌측 곡률), h = 12 (우측 곡률).

가벼우면 약간 빨라지고, 초과하면 빠르게 둔해진다. 한도 정확히 맞추기가 아니라 여유롭게 가져가는 쪽이 보너스가 있다는 의도.

거래 / 모루 / 미션 인벤토리 공유

섹션 제목: “거래 / 모루 / 미션 인벤토리 공유”

같은 InventoryInfo 구조를 재사용해 여러 상호작용 UI에서 동일한 격자 조작을 제공한다.

용도컨테이너
휴대 인벤토리PlayerInventoryInfo
창고StorageInventoryInfo
거래 (상인)TradeInventoryInfo — NPC 제안 칸 + 플레이어 제안 칸 양측
모루 (파츠)AnvilInventoryPopupPlayerInventoryInfo를 그대로 사용
미션 (반납·확인)MissionPopupPlayerInventoryInfo를 그대로 사용
상자 / 시체별도 컨테이너로 휴대와 양방향 이동

거래 인벤토리는 NPC 제안 영역과 플레이어 제안 영역으로 나뉘어 양측 칸 점유를 별도로 관리한다.

  • 이도류 운용 정책 (좌우 무기 동시 / 한쪽 방패 전용).
  • Quick 슬롯 공용 쿨다운·아이템 개별 쿨다운의 수치.
  • 격자 확장의 클래스·메타·미션 트리거 기준.
  • 회전 제약 아이템(예: 명괴 무기) 도입 여부.
시스템연결 지점
런 구조출정 전 준비 단계에서 휴대↔창고 정리. 런 종료 시 보존/손실 처리.
아이템 / 루팅 / 드랍루팅 결과(DropItemInfo)가 휴대에 적재. 아이템 칸 크기·스택은 아이템 마스터 종속.
전투휴대 무게가 이동·구르기·질주 성능에 영향. 장착 무기·방패가 전투 능력 결정.
파츠모루에서 휴대 무기에 파츠 결합. isAnvilSettled 플래그 연동.
미션 / NPC / 상인거래 인벤토리·미션 반납이 휴대 인벤토리를 직접 참조.
캐릭터 스테이터스STR·VIT가 최대 중량을 결정.
영역시트 / DTO
휴대 / 창고 격자 크기(코드 상수 — 시트화 예정)
아이템 칸 크기·스택·무게아이템 시트 ItemTableData (inventorySize, weight, stack)
가방 확장 칸아이템 시트 BagTableData.extraSlotRowColumn
벨트 Quick 슬롯 수아이템 시트 BeltTableData.slotCount
무게 곡선 파라미터WeightMoveSpeedCalculator (ScriptableObject — 시트화 검토)