Files
BeatSaber/md/UnitySceneSetupGuide.md

8.9 KiB

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는 기기의 특정 폴더에 넣어야 함.

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