116 lines
5.3 KiB
Markdown
116 lines
5.3 KiB
Markdown
# VR 장보기 시뮬레이션 (Shopping VR)
|
|
|
|
> Unity 6 · XR Interaction Toolkit 기반 1인칭 VR 장보기 게임. 장보기 목록대로 매장에서 상품을 골라 셀프 계산대에서 결제하고, NPC와 대화하며 시식·포만감 관리까지 수행한다.
|
|
|
|
<!-- 헤더용 GIF/이미지 자리 (TODO: 매장 입장 → 주문서 펼치기 → 스캔 → 결제 4컷 GIF) -->
|
|
<!--  -->
|
|
|
|
---
|
|
|
|
## 데모 영상
|
|
|
|
<!-- TODO: 유튜브/구글드라이브 링크 또는 GIF -->
|
|
- 메인 데모(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. 카트 시스템
|
|
<img src="/readme/cart2.png" width="300"><br>
|
|
- 해당 영역에 아이템이 들어오면, 아이템의 움직임이 없어질 때(혹은 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
|