티스토리 뷰
🟩 학습 목표
- FGameplayTag의 계층 구조를 네이티브 시스템으로 구축하여 하드코딩된 문자열 의존성을 제거하고 데이터 무결성을 확보한다.
- 퀵슬롯 무기 스왑 및 자동 장착 인터락 로직을 구현하여 인터랙션의 예외 처리를 정밀화한다.
- GameplayTagContainer 기반의 상태 제어 시스템을 구축하여 멀티플레이 환경에서의 동시 접근 제어 및 네트워크 파이프라인을 정립한다.
🟧 1. 인벤토리 구조 최적화: 네이티브 GameplayTags 도입
🟦 문자열 파편화 방지 및 계층 구조 정립
기존에 하드코딩된 문자열(예: "ItemType.Weapon")에 의존하던 방식은 오타 발생 위험이 크고, 아이템 계층 구조가 파편화되어 유지보수가 어려웠다. 이를 해결하기 위해 NCGameplayTags.h/cpp에 네이티브 태그를 등록하여 중앙화된 계층 구조를 구축하였다.
- 네이티브 계층: Item.Equipment.Weapon, Item.Consumable.Heal 등 루트-자식 관계를 명확히 정의하였다.
- 성능 및 안정성: MatchesTag 함수를 활용하여 태그 계층을 비교함으로써 로직의 가독성을 높였으며, 단순 문자열 비교를 배제하여 런타임 하드코딩 오류를 100% 제거하였다.
🟧 2. 인벤토리 및 퀵슬롯 비즈니스 로직 고도화
🟦 슬롯별 책임 분리 및 방어 로직
- 퀵슬롯 제약: 1~2번 슬롯(무기), 3번(힐), 4번(음식)으로 기능을 엄격히 분리하였다. 잘못된 아이템이 슬롯에 장착되는 논리적 오류를 방지하기 위해 GameplayTag 필터링 방어 로직을 적용하였다.
- 스왑 인터락(Interlock): 퀵슬롯 장착 해제 시, 현재 캐릭터 손에 들린 무기를 강제로 제거하여 맨손 상태로 전환하는 안전장치를 구현하여 상태 불일치를 방지하였다.
- 자동 장착(Auto-Equip): AutoEquipItem 함수를 구현하여, 아이템 태그를 분석한 뒤 인벤토리 내 최적의 빈 슬롯을 스스로 찾아 장착하는 로직을 완성하였다. 이는 향후 UI 클릭 연동 기반의 핵심 백엔드 API로 활용된다.
- 데이터 영속성: UNCSaveGame 클래스 내부에 퀵슬롯 데이터 구조를 통합하고, 컴포넌트 레벨에서 이를 디스크에 영구 저장/불러오기 하는 아키텍처를 구현하여 아이템 상태 보존 로직을 완성하였다.
🟧 3. 파밍 상자(LootBox) 시스템 확장 및 동시 접근 제어
🟦 태그 기반 상태 관리 전환
기존의 bool 플래그 방식은 상태 확장에 한계가 있었다. 이를 FGameplayTagContainer 기반의 상태 관리 방식으로 전면 전환하여, LootBox.State.BeingLooted와 같은 태그를 통해 상자의 현재 상태를 정교하게 추적하도록 개선하였다.
🟦 멀티플레이어 동시 접근 방지 (Lock)
멀티플레이 환경에서 여러 플레이어가 동시에 같은 상자를 여는 경합 조건(Race Condition)을 방지하기 위해 태그 기반 잠금(Lock) 시스템을 구현하였다.
- 접근 제어: 상호작용 시 CanInteract와 Interact 로직에 BeingLooted 태그가 이미 활성화되어 있는지 확인하는 절차를 추가하였다. 태그가 존재하면 즉시 차단하여 동시 접근 버그를 원천 봉쇄하였다.
- 네트워크 파이프라인: * Client_OpenLootBoxUI: 클라이언트가 상자를 열 때 UI를 띄우도록 명령하는 RPC를 설계하였다.
- TakeItemFromLootBox: 서버 권한 측에서 아이템 이동 로직을 안전하게 처리하고, 검증된 결과값만 복제하여 데이터 불일치를 방지하는 로직을 구축하였다.
🟧 핵심 요약
- 하드코딩 문자열을 Native GameplayTags로 대체하여 시스템 계층화와 오타 없는 안정적인 데이터 로직을 확보하였다.
- 퀵슬롯의 슬롯별 책임 분리와 인터락 로직을 통해 아이템 사용의 안전성을 극대화하고, 자동 장착 및 데이터 영속성 로직으로 시스템 편의성을 높였다.
- 파밍 상자의 상태를 GameplayTagContainer로 관리함으로써 멀티플레이어 환경에서의 동시 접근 제어(Locking)를 실현하고, 안정적인 서버-클라이언트 간 아이템 이동 RPC 구조를 완성하였다.
'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글
| OnConstruction SSOT 수립, 무기 스왑 인터락 및 복제 안전장치 설계 (0) | 2026.06.10 |
|---|---|
| 파밍 상자 확률 시스템 구현 및 PlayerState 기반 인벤토리 아키텍처 리팩토링 (0) | 2026.06.09 |
| UMG Drag & Drop 이벤트 처리의 함정과 인벤토리 세이브/로드 아키텍처 (0) | 2026.06.08 |
| 데이터 주도형(Data-Driven) 인벤토리 리팩터링 및 에디터 작업 프로세스 최적화 (0) | 2026.06.05 |
| 멀티플레이 인벤토리 - 드래그 앤 드롭 구현 및 데이터·액터 분리 구조의 이해 (0) | 2026.06.02 |

