기존에는 AudioSource.volume을 직접 조절했다.
BGM / SFX를 분리해 관리하고 있었기 때문에 당장 문제는 없었다.
하지만 다음을 고려했다.
그래서 개별 Source 제어 → 그룹 단위 제어로 변경했다.

Create > AudioMixerenum AudioMixerGroupType
{
Bgm,
Sfx
}
문자열 하드코딩을 줄이기 위한 구조다.
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);
}
증상:
원인:
AudioMixer는 실행 시 Snapshot 값으로 초기화된다.
Awake → Snapshot 적용 → Start
Awake에서 설정한 값이 Snapshot에 의해 덮어씌워졌다.
초기 복원 코드를 Start()에서 실행하도록 변경했다.
private void Start()
{
foreach (AudioMixerGroupType type in Enum.GetValues(typeof(AudioMixerGroupType)))
{
float saved = PlayerPrefs.GetFloat(type.ToString(), 1f);
SetVolume(type, saved);
}
}
Snapshot 적용 이후 덮어쓰기 때문에 정상 동작한다.