일단 볼륨을 조절하기 위한 Slider를 만들어 준다.
그리고 AudioMixer를 만들어 준다.
이후, AudioMixer Group을 새로 생성하고, 용도에 맞춰 이름을 변경해준다.
그 다음, 사용하고자 하는 Group의 Attenuation에서 Volume을 우클릭, Expose 'Volume (of 그룹 이름)' to script
를 설정
Volume 옆에 화살표가 생기면 완료.
마지막으로 오른쪽 위의 Exposed Parameters에서 방금 설정한 Group에 맞춰 parameter의 이름을 변경해준다.
이 설정을 통해 코드에서 해당 parameter를 찾아 수정해줄 수 있다.
이후 AudioManager 혹은 SoundManager에게 AudioSource를 붙여주고, Output에 방금 생성한 AudioMixer를 연결한다.
다음으로, Slider를 통해 Volume을 조절하기 위해서 AudioMixController.cs를 작성하여 달아주자.
using UnityEngine.Audio; // audioMixer를 사용하기 위해
using UnityEngine.UI; // Slider, Toggle을 사용하기 위해
public class AudioMixController : MonoBehaviour
{
[SerializeField] private AudioMixer audioMixer;
[SerializeField] private Slider BGMSlider; // 볼륨을 조절할 Slider
[SerializeField] private Toggle BGMMute; // Mute를 On / Off할 Toggle
private void Awake()
{
// 슬라이더의 값이 변경될 때 AddListener를 통해 이벤트 구독
BGMSlider.onValueChanged.AddListener(SetBGMVolume);
// 토클의 값이 변경될 때 AddListener를 통해 이벤트 구독
BGMMute.onValueChanged.AddListener(SetBGMMute);
}
// Start is called before the first frame update
void Start()
{
// PlayerPrefs에 Volume 값이 저장되어 있을 경우,
if (PlayerPrefs.HasKey("Volume"))
{
// Slider의 값을 저장해 놓은 값으로 변경.
BGMSlider.value = PlayerPrefs.GetFloat("Volume");
}
else
BGMSlider.value = 0.5f; // PlayerPrefs에 Volume이 없을 경우
// audioMixer.SetFloat("audioMixer에 설정해놓은 Parameter", float 값)
// audioMixer에 미리 설정해놓은 parameter 값을 변경하는 코드.
// Mathf.Log10(BGMSlider.value) * 20 : 데시벨이 비선형적이기 때문에 해당 방식으로 값을 계산.
audioMixer.SetFloat("BGM", Mathf.Log10(BGMSlider.value) * 20);
}
// Slider를 통해 걸어놓은 이벤트
public void SetBGMVolume(float volume)
{
// 변경된 Slider의 값 volume으로 audioMixer의 Volume 변경하기
audioMixer.SetFloat("BGM", Mathf.Log10(volume) * 20);
// 변경된 Volume 값 저장하기
PlayerPrefs.SetFloat("Volume", BGMSlider.value);
}
private void SetBGMMute(bool mute)
{
// AudioListener : Audio를 듣는 객체. 보통 카메라에 달려있다.
AudioListener.volume = (mute ? 0 : 1);
}
}
스크립트를 달아주고 필요한 오브젝트들을 추가한다.
그 다음, Slider에 OnValueChanged에 SetBGMVolume을 추가해주고, Min Value를 0.0001로 변경한다.
0이 아니라 0.0001인 이유는 0일 경우 음악이 깨져서 나오기 때문이라고 한다.
Slider가 변경됨에 따라 Inspector의 Volume도 변경되는 것을 확인할 수 있다.