# Unity 씬 구성 가이드
> VRBeatSaber — 스크립트 연결 및 씬 세팅

---

## 0. 시작 전 — Build Settings

**File → Build Settings → Add Open Scenes**

순서대로 추가:
```
0. Scenes/Intro
1. Scenes/SongSelect     ← 신규 생성
2. Scenes/SongCreator    ← 신규 생성
3. Scenes/Game
4. Scenes/MapEditorScene
```

---

## 1. SongCard 프리팹 생성 (먼저 만들어야 함)

**Project 창 → Assets/Prefab → 우클릭 → Create Empty**
이름: `SongCard`

계층 구조:
```
SongCard (Button 컴포넌트 추가)
├── Background (Image)
├── TitleText   (TextMeshPro - Text(UI))
├── ArtistText  (TextMeshPro - Text(UI))
├── DurationText (TextMeshPro - Text(UI))
└── DownloadedBadge (Image — 초록 원 또는 체크 아이콘)
```

SongCard 루트에 **SongCard.cs** 컴포넌트 추가 후 Inspector 연결:
| 필드 | 연결 대상 |
|------|-----------|
| Title Text | TitleText |
| Artist Text | ArtistText |
| Duration Text | DurationText |
| Downloaded Badge | DownloadedBadge |
| Button | 루트의 Button 컴포넌트 |

완료 후 **Assets/Prefab/SongCard.prefab** 으로 저장

---

## 2. Intro 씬

기존 씬 재활용. 기존 UI 제거 후 아래 구성.

```
[Hierarchy]
├── Main Camera
├── XR Origin (기존 유지)
└── Canvas (World Space)
    └── IntroPanel
        ├── TitleText      "VR BEAT SABER"
        ├── PlayButton     "게임하기"
        └── CreateButton   "노래만들기"
```

**Canvas 설정:**
- Render Mode: `World Space`
- Position: (0, 1.5, 2)
- Width/Height: 600 / 400

**빈 오브젝트 [IntroManager] 생성 → IntroManager.cs 추가:**
| 필드 | 값 |
|------|-----|
| Play Button | PlayButton |
| Create Button | CreateButton |
| Song Select Scene | `SongSelect` |
| Song Creator Scene | `SongCreator` |

---

## 3. SongSelect 씬 (신규)

**File → New Scene → 저장: Assets/Scenes/SongSelect**

### 계층 구조
```
[Hierarchy]
├── Main Camera
├── XR Origin
├── [GameManager]            ← 빈 오브젝트
└── Canvas (World Space)
    ├── TabPanel
    │   ├── TabAllButton     "전체"
    │   └── TabOwnedButton   "보유중"
    ├── ListPanel
    │   └── ScrollRect
    │       └── Viewport
    │           └── CardContainer   ← Content 오브젝트
    ├── DetailPanel              ← SongDetailPanel이 붙는 오브젝트
    │   ├── TitleText
    │   ├── ArtistText
    │   ├── InfoText             (BPM / 길이)
    │   ├── DifficultyPanel
    │   │   ├── EasyButton
    │   │   ├── NormalButton
    │   │   ├── HardButton
    │   │   └── ExpertButton
    │   ├── ActionPanel
    │   │   ├── DownloadButton   "다운로드"
    │   │   ├── DeleteButton     "삭제"
    │   │   └── PlayButton       "▶ 플레이"
    │   └── ProgressGroup
    │       ├── ProgressSlider
    │       └── ProgressText
    ├── LoadingOverlay           ← 전체 덮는 반투명 패널
    │   └── LoadingText          "불러오는 중..."
    └── ErrorOverlay
        └── ErrorText
```

### Canvas 설정
- Render Mode: `World Space`
- Position: (0, 1.5, 2)
- Width: 1200 / Height: 700

### [GameManager] 오브젝트에 컴포넌트 추가
1. **SongLibrary.cs**
2. **CacheManager.cs**
3. **DownloadManager.cs**

DownloadManager Inspector:
| 필드 | 값 |
|------|-----|
| Base Url | `http://whdwo798.synology.me:8180/beatsaber` |

### DetailPanel에 SongDetailPanel.cs 추가
| 필드 | 연결 대상 |
|------|-----------|
| Title Text | TitleText |
| Artist Text | ArtistText |
| Info Text | InfoText |
| Btn Easy | EasyButton |
| Btn Normal | NormalButton |
| Btn Hard | HardButton |
| Btn Expert | ExpertButton |
| Download Button | DownloadButton |
| Delete Button | DeleteButton |
| Play Button | PlayButton |
| Progress Group | ProgressGroup |
| Progress Slider | ProgressSlider |
| Progress Text | ProgressText |
| Game Scene Name | `Game` |

### Canvas 루트에 SongSelectManager.cs 추가
| 필드 | 연결 대상 |
|------|-----------|
| Tab All Btn | TabAllButton |
| Tab Owned Btn | TabOwnedButton |
| Card Container | CardContainer |
| Song Card Prefab | Assets/Prefab/SongCard |
| Detail Panel | DetailPanel |
| Download Manager | [GameManager]의 DownloadManager |
| Loading Overlay | LoadingOverlay |
| Error Overlay | ErrorOverlay |
| Error Text | ErrorText |

### ScrollRect 설정 (ListPanel)
- Scroll Rect → Content: CardContainer
- CardContainer에 **Vertical Layout Group** 추가
  - Spacing: 10
  - Child Force Expand Width: ✓

---

## 4. SongCreator 씬 (신규)

**File → New Scene → 저장: Assets/Scenes/SongCreator**

### 계층 구조
```
[Hierarchy]
├── Main Camera
├── XR Origin
├── [CreatorManager]         ← 빈 오브젝트
└── Canvas (World Space)
    ├── TitleText            "노래 만들기"
    ├── AudioPanel
    │   ├── AudioDropdown    (TMP_Dropdown)
    │   ├── RefreshButton    "새로고침"
    │   └── InputPathHint    (TMP_Text - 경로 안내)
    ├── MetaPanel
    │   ├── TitleInput       (TMP_InputField) Placeholder: "곡 제목"
    │   ├── ArtistInput      (TMP_InputField) Placeholder: "아티스트"
    │   └── BpmInput         (TMP_InputField) Placeholder: "BPM" / Content Type: Decimal Number
    ├── DifficultyPanel
    │   ├── EasyToggle       "Easy"
    │   ├── NormalToggle     "Normal"
    │   ├── HardToggle       "Hard"    (기본값 ON)
    │   └── ExpertToggle     "Expert"  (기본값 ON)
    ├── ActionPanel
    │   ├── GenerateButton   "AI 생성 시작"
    │   └── ManualButton     "직접 만들기 →"  ← 작게
    └── ProgressGroup
        ├── StatusText
        └── ProgressSlider
```

### [CreatorManager] 오브젝트에 컴포넌트 추가
1. **BeatSageUploader.cs**
2. **NasPublisher.cs**
3. **SongCreatorManager.cs**

NasPublisher Inspector:
| 필드 | 값 |
|------|-----|
| Nas Base Url | `http://192.168.55.3:5000` |
| Nas Account | `admin` |
| Nas Password | _(DSM 비밀번호 입력)_ |
| Nas Root Path | `/volume1/web/beatsaber` |
| Static Base Url | `http://whdwo798.synology.me:8180/beatsaber` |

SongCreatorManager Inspector:
| 필드 | 연결 대상 |
|------|-----------|
| Audio Dropdown | AudioDropdown |
| Refresh Btn | RefreshButton |
| Input Path Hint | InputPathHint |
| Title Input | TitleInput |
| Artist Input | ArtistInput |
| Bpm Input | BpmInput |
| Toggle Easy | EasyToggle |
| Toggle Normal | NormalToggle |
| Toggle Hard | HardToggle |
| Toggle Expert | ExpertToggle |
| Generate Button | GenerateButton |
| Manual Editor Button | ManualButton |
| Progress Group | ProgressGroup |
| Status Text | StatusText |
| Progress Slider | ProgressSlider |
| Beat Sage Uploader | [CreatorManager]의 BeatSageUploader |
| Nas Publisher | [CreatorManager]의 NasPublisher |
| Map Editor Scene | `MapEditorScene` |

---

## 5. Game 씬 수정

기존 Spawner 오브젝트에서 `songName` 필드 제거됨.
아래만 확인하면 됨.

**Spawner 오브젝트 Inspector 확인:**
| 필드 | 연결 대상 |
|------|-----------|
| Audio Source | AudioSource 컴포넌트 |
| Cube Prefabs | [0] RED.prefab / [1] BLUE.prefab |
| Spawn Points | 기존 4개 SpawnPoint Transform |
| Note Speed | 2.0 |
| Distance To Hit | 10.0 |
| Song Select Scene Name | `SongSelect` |

> ⚠️ 기존에 AudioSource에 AudioClip이 연결되어 있으면 제거할 것.
> 이제 런타임에 로컬 파일에서 자동 로드됨.

---

## 6. 씬 이름 문자열 일치 확인

스크립트 내 씬 이름과 실제 파일명이 반드시 일치해야 함.

| 스크립트 | 필드 | 반드시 일치해야 할 씬 파일명 |
|----------|------|--------------------------|
| IntroManager | Song Select Scene | `SongSelect` |
| IntroManager | Song Creator Scene | `SongCreator` |
| SongDetailPanel | Game Scene Name | `Game` |
| SongCreatorManager | Map Editor Scene | `MapEditorScene` |
| Spawner | Song Select Scene Name | `SongSelect` |

---

## 7. Quest 음원 파일 넣는 방법 (SongCreator용)

Beat Sage에 보낼 MP3는 기기의 특정 폴더에 넣어야 함.

```bash
# ADB로 파일 복사
adb push life.mp3 /sdcard/Android/data/[패키지명]/files/input/
```

Unity Editor에서는 아래 경로에 넣으면 됨:
```
C:\Users\[유저명]\AppData\LocalLow\[Company]\[Product]\input\
```

---

## 8. 최종 동작 확인 순서

1. NAS 접속 확인: 브라우저에서 `http://whdwo798.synology.me:8180/beatsaber/songs.json` 열기
2. Unity Play → Intro 씬 실행
3. [게임하기] → SongSelect 씬 로드 → 곡 목록 표시 확인
4. 곡 다운로드 → 플레이 진입 확인
5. Intro → [노래만들기] → SongCreator 씬 → MP3 선택 → AI 생성 시도
