Cheerful and bright 8-bit style background music for a 2D pixel art roguelike grassy field stage. Light, playful, upbeat and cute melody, evoking a sunny first level in a retro game.
원시 프롬프트
게임 플레이 시 배경음악을 재생할 수 있게 구현하는 프롬프트를 구현해줘. 재생할 mp3는 기존에 있던 테이블 Stage.csv에 신규 컬럼 (bgm)을 추가해 거기서 입력할 수 있게 해줘.
Unity C# 코드를 작성해줘. 목적: 게임 플레이 시 배경음악(BGM)을 재생한다. 재생할 mp3는 Stage.csv의 신규 컬럼 `bgm`에서 지정하며, 스테이지 진입/변경 시 해당 트랙을 자동 재생한다.
요구사항
1) 데이터 스키마
- Stage.csv에 문자열 컬럼 `bgm`을 추가한다. 예) "forest_theme.mp3" 또는 "Audio/BGM/forest_theme" 형식.
- 기존 Stage 데이터 로더(예: CsvLoader/StageRepository/StageTable 등)에 `bgm` 필드 매핑을 추가한다.
- `bgm`가 비어 있으면 기본 트랙(옵션) 또는 무음.
2) BGM 매니저
- 싱글턴 `BgmManager`(DontDestroyOnLoad). 내부에 2개의 AudioSource(A/B)를 두어 크로스페이드 지원.
- 공개 메서드:
- `PlayByStage(StageData stage)` : stage.bgm 이름으로 재생(이미 같은 트랙이면 아무것도 하지 않음).
- `Play(string trackName, float fade=1.0f)` : 트랙명으로 직접 재생.
- `Stop(float fade=0.5f)` : 페이드아웃 후 정지.
- `SetVolume(float volume)` : 0~1.
- 크로스페이드: 기본 1.0초. 인스펙터로 조절 가능.
- 루프 재생, SpatialBlend=0(2D), pitch=1.0.
- Time.timeScale=0에서도 재생 유지(AudioListener.pause 사용 안 함).
3) 리소스 로딩
- 우선순위: (1) Addressables 키 == trackName → 실패 시 (2) Resources.Load<AudioClip>(trackNameWithoutExt).
- `bgm` 값에 확장자(.mp3/.ogg) 유무를 허용하며, Resources 경로일 경우 확장자 제거 처리.
- 실패 시 경고 로그 1회 출력 후 무음 유지.
- 간단한 캐싱(Dictionary<string, AudioClip>)으로 재로딩 최소화.
4) 스테이지 전환 연동
- 스테이지 시작/로딩이 완료되는 지점(기존 StageManager/GameFlow 등)에서 `BgmManager.PlayByStage(currentStage)` 호출.
- 스테이지 재시작 시도 시에도 다시 호출해 상태 맞춤.
- 동일 트랙이면 중복 재생/리셋 방지(가드).
5) 볼륨/믹서
- (옵션) AudioMixerGroup 할당 지원: `public AudioMixerGroup bgmOutputGroup`.
- 마스터 볼륨은 인스펙터/코드로 조절 가능하게 노출.
- Mute 토글 제공.
6) 에러/예외 처리
- `bgm`가 null/빈 문자열 → 재생 스킵(로그 선택적).
- 로딩 실패 → 스킵(경고).
- 동일 프레임 다중 호출 시 1회만 처리(가드).
7) 코드 구성
- 클래스: `BgmManager`(+ 내부 `CrossfadePlayer` 로직) / Stage 데이터 모델에 `public string bgm;`
- CSV 파서 변경: 헤더에 `bgm` 추가, 매핑 로직 보강.
- 주석: Addressables/Resources 배치 규칙과 경로 규칙 명시.
8) 테스트 헬퍼(선택)
- 임시 디버그 UI 버튼: Next/Prev Track, Volume Slider(선택사항, 주석 처리 가능).
마지막에 “유니티 세팅 체크리스트” 주석을 추가해줘:
- Stage.csv에 `bgm` 컬럼 추가(예: id,time,...,bgm). 예시: 1,90,...,Audio/BGM/forest_theme
- mp3/ogg 클립을 Addressables로 빌드하거나, Resources 폴더(예: Resources/Audio/BGM/forest_theme.ogg)에 배치
- BgmManager 프리팹(또는 빈 오브젝트) 생성 → 컴포넌트 부착 → AudioSource 2개 자동 생성/연결
- 필요 시 AudioMixer와 BGM 그룹 연결
- Stage 시작 로직(예: StageManager.OnStageStarted)에서 `BgmManager.Instance.PlayByStage(currentStage)` 호출