# VR 장보기 시뮬레이션 (Shopping VR)
> Unity 6 · XR Interaction Toolkit 기반 1인칭 VR 장보기 게임. 장보기 목록대로 매장에서 상품을 골라 셀프 계산대에서 결제하고, NPC와 대화하며 시식·포만감 관리까지 수행한다.
---
## 플레이 영상
- 영상: https://www.youtube.com/watch?v=t2WyUqiUZ4A
- PDF : https://drive.google.com/file/d/1UpgeoaQndC7Yv8zPr0ly4eUneE2MRlsF/view?usp=sharing
---
## 프로젝트 정보
| | |
|---|---|
| **개발 기간** | _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. 씬 전환 커스텀 사이클
- **`ISceneInitializable` 인터페이스** — 씬을 가로지르는 매니저(`SceneLoadManager`)가 새 씬 로드 직후 씬 내의 모든 `ISceneInitializable`를 전부 찾아 `OnSceneLoaded()`를 호출함.
---
## 아키텍처
```
Managers (DontDestroyOnLoad, 싱글톤)
├─ GameManager 게임관리 및 매니저 결선
├─ InputManager 입력
├─ SoundManager BGM / SFX / VOICE
└─ SceneLoadManager 씬 전환, ISceneInitializable 알림
│
▼
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