[Unity] AudioMixer

shin0112·2026년 3월 4일

Unity

목록 보기
13/13

0. 배경

기존에는 AudioSource.volume을 직접 조절했다.
BGM / SFX를 분리해 관리하고 있었기 때문에 당장 문제는 없었다.

하지만 다음을 고려했다.

  • SFX 세분화 가능성 (UI / 몬스터 / 환경음 등)
  • 컷씬에서 특정 그룹만 감쇠
  • 타임라인과 연동
  • 모든 AudioSource를 추적하는 구조의 확장성 한계

그래서 개별 Source 제어 → 그룹 단위 제어로 변경했다.


이런 식으로 다 분리 가능!


1️⃣ Mixer 구성

  • Create > AudioMixer
  • Bgm / Sfx 그룹 생성
  • Volume → Expose to Scripts
  • enum 이름과 파라미터 이름을 동일하게 설정
enum AudioMixerGroupType
{
    Bgm,
    Sfx
}

문자열 하드코딩을 줄이기 위한 구조다.


2️⃣ 핵심 구현

Mixer는 dB 단위를 사용한다.

public void SetVolume(AudioMixerGroupType type, float normalized)
{
    string param = type.ToString();

    float db = Mathf.Log10(
        Mathf.Clamp(normalized, 0.0001f, 1f)
    ) * 20f;

    mixer.SetFloat(param, db);
    PlayerPrefs.SetFloat(param, normalized);
}
  • 체감 음량은 로그 기반
  • 0~1 값을 그대로 넣으면 감소가 급격함
  • 로그 변환이 필요

3️⃣ 문제 — Snapshot 초기화

증상:

  • 저장 정상
  • 불러오기 정상
  • 실행 시 기본값으로 돌아감

원인:

AudioMixer는 실행 시 Snapshot 값으로 초기화된다.

Awake → Snapshot 적용 → Start

Awake에서 설정한 값이 Snapshot에 의해 덮어씌워졌다.


4️⃣ 해결

초기 복원 코드를 Start()에서 실행하도록 변경했다.

private void Start()
{
    foreach (AudioMixerGroupType type in Enum.GetValues(typeof(AudioMixerGroupType)))
    {
        float saved = PlayerPrefs.GetFloat(type.ToString(), 1f);
        SetVolume(type, saved);
    }
}

Snapshot 적용 이후 덮어쓰기 때문에 정상 동작한다.


정리

  • 제어 단위를 AudioSource → AudioMixerGroup으로 변경
  • 로그 기반 볼륨 변환 적용
  • Snapshot 초기화 순서 고려 필요

0개의 댓글