# 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 생성 시도