# VR 장보기 시뮬레이션 (Shopping VR) > Unity 6 · XR Interaction Toolkit 기반 1인칭 VR 장보기 게임. 장보기 목록대로 매장에서 상품을 골라 셀프 계산대에서 결제하고, NPC와 대화하며 시식·포만감 관리까지 수행한다. --- ## 데모 영상 - 메인 데모(2분): _업로드 예정_ - 하이라이트(30초): _업로드 예정_ - 빌드(.apk, Quest 사이드로드): _업로드 예정_ --- ## 프로젝트 정보 | | | |---|---| | **개발 기간** | _2026.04 ~ 2026.05_ | | **인원** | 1인 (기획·개발·일부 에셋 통합) | | **플랫폼** | Meta Quest (Android XR / OpenXR), PC VR | | **엔진** | Unity 6000.3.9f1 · URP 17.3 | | **주요 패키지** | XR Interaction Toolkit 3.3, XR Hands 1.7, OpenXR 1.16, Oculus XR 4.5 | --- ## 게임 플로우 1. **GameStartScene** — 시작 화면에서 게임 진입 (비동기 로딩) 2. **GameScene (매장)** — 좌측 컨트롤러 Primary 버튼으로 장보기 목록 펼치기 3. **상품 픽업** — XR Direct Interactor로 상품을 잡아 카트에 넣음. 4. **셀프 계산대** — 바코드로 상품을 스캔하면 항목이 행으로 추가됨, 합계 자동 갱신 5. **결제** — 예산에서 차감 → 장보기 목록 충족 검사 → Clear / Missing 패널 분기 6. **부가 시스템** — NPC 대화 시스템, 포만감 시스템 --- ## 핵심 기능 ### 1. 장보기 목록 미션 시스템 - 아이템 데이터는 상품 ID·브랜드·`ItemCategory`(과일/유제품/스낵 등)·`ProductGroup`(브랜드별 구체 상품)으로 구성. 카테고리는 매대 분류용, 그룹은 미션 매칭용으로 의도적으로 두 단계로 나눔. - 장보기 목록을 SO로 데이터화. 목록을 직접 인스펙터에서 추가할 수 있으며, 차후 랜덤으로 변경 예정. ### 2. 셀프 계산대 - 스캔 영역 콜라이더로 충돌체들 수집한 뒤, 가장 가까운 상품 한 개만 스캔. - 스캔할 때마다 계산목록에 하나씩 추가되며, 추가 버튼과 감소 버튼으로 수량 조절 가능. - 결제시 미션 목록과 비교하여, 부족할 시 부족분을 보여주고 만족할시 클리어. ### 3. NPC 대화·립싱크 시스템 - NPC에 상호작용 할 시, 대화 발생. - NPC는 '녹음되어 있는 음성'으로 정보를 전달하며, 특정 대사에 시선, 표정, 제스처를 부여할 수 있음. - NPC의 대사 중에는 '선택'을 요구하는 경우가 있으며, 임의의 선택지를 선택시 해당 선택지가 가지고 있는 대화노드로 점프함. - **블렌드셰이프 립싱크** — 입 관련 블렌드셰이프 7종에 가중치 분배. 오디오 소스의 실시간 소리 진폭에 기반하여 `LateUpdate`에서 표정 `Animator`를 덮어씀. ### 4. 플레이어 시스템 - 손 마다 각각 상품을 잡으면, 상품의 정보가 캔버스UI로 보여짐. 양손으로 가격 비교 가능. - 시간이 흐르면서 포만감 게이지 감소. 0이 되면 이동속도 대폭감소하며, 시식으로 포만감 회복 시 원본 속도 복구. - '예산'이 존재하며, 예산보다 큰 금액의 결제를 막음. ### 5. 카트 시스템
- 해당 영역에 아이템이 들어오면, 아이템의 움직임이 없어질 때(혹은 0.3초가 지났을 때) 물리영향을 끄고 카트의 움직임을 `ParentConstraint` 로 추적. - 이렇게 해야 카트와 아이템이 따로 움직이지 않고, 물건 위에 물건이 쌓였을 때의 버그가 없었음. ### 6. 씬 전환 커스텀 사이클 - **`ITransScenePossible` 인터페이스** — 씬을 가로지르는 매니저(`SceneLoadManager`)가 새 씬 로드 직후 씬 내의 모든 `ITransScenePossible`를 전부 찾아 `OnSceneLoaded()`를 호출함. --- ## 아키텍처 ``` Managers (DontDestroyOnLoad, 싱글톤) ├─ GameManager 게임관리 및 매니저 결선 ├─ InputManager 입력 ├─ SoundManager BGM / SFX / VOICE └─ SceneLoadManager 씬 전환, ITransScenePossible 알림 │ ▼ Scene-local ├─ LocalManager ├─ UIManager ├─ Player └─ Item │ ▼ Data (ScriptableObject) ├─ ItemData / ShoppingOrderList / ShoppingOrderEntry ├─ DialogGroup / DialogNode / DialogChoice / VoiceClip └─ CharacterData / ExpressionData / GestureData ``` ## 사용한 외부 에셋 | 분류 | 에셋 | 용도 | |---|---|---| | XR | XR Interaction Toolkit, XR Hands, OpenXR, Oculus XR | 컨트롤러·핸드 인터랙션 기반 | | XR 확장 | MikeNspired XRI Starter Kit | Climbing, DistanceGrab, HandPoser | | 캐릭터 | BoZo Modular Anime Characters | NPC 모델·블렌드셰이프 | | 의상 시뮬 | Magica Cloth 2 | 옷·머리카락 물리 | | 셰이딩 | RealToon, Umbra Soft Shadows, BadDog AreaLight | 툰 셰이딩·소프트 섀도우 | | 인터랙션 피드백 | HighlightPlus, Outline Plus | Hover/Grab 외곽선 | | VFX | CartoonVFX9X | 스캔·결제 이펙트 | --- ## 빌드 / 실행 ### 요구 사항 - Unity **6000.3.9f1** - (Quest 빌드) Android Build Support, OpenXR Loader: Meta Quest