비트 찍기 완료 및 클로드를 통한 api작업
This commit is contained in:
@@ -0,0 +1,300 @@
|
||||
# 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 생성 시도
|
||||
Reference in New Issue
Block a user