저번에 해상도를 변경할 수 있는 설정을 만들었다. 설정창에 해상도변경 기능밖에 없어 되게 허전한 느낌이다. 그래서 이번엔 인게임 내에서 사운드를 조절하는 설정을 만들어 볼 예정이다.
나는 게임의 전체 볼륨을 조절하는 마스터 볼륨이 아니라 배경음과 효과음으로 나누어 조절할 수 있도록 만들 것이다.
먼저 지난번에 만들었던 설정창에 아래 그림과 같이 UI의 Slider를 사용하여 기본틀을 만들어줬다. 이제 Slider를 드래그해서 볼륨을 조절할 수 있게 만들 것이다.
Project창 우클릭 -> Create -> Audio Mixer
를 통해 Audio Mixer를 생성할 수 있다. 나는 배경음과 효과음을 따로 관리할 것이기 때문에 2개를 만들어줬다.
Audio Mixer를 생성했으면 이제 사운드를 관리할 Audio Source의 Output에 Audio Mixer를 연결해주자. 아래 그림은 배경음 오브젝트의 Audio Source에 BgmMixer를 연결한 사진이다. 효과음 오브젝트의 Audio Source에는 SfxMixer를 연결해주자.
그리고 Audio Mixer를 스크립트에서 관리하려면 Inspector창에서 한가지 설정이 필요하다. 아래 사진과 같이 Attenuation의 Volume부분을 우클릭해서 Expose 'Volume (of Master) to script
를 클릭해주면 Exposed Parameters에 Parameter가 하나 추가된것을 확인할 수 있다. 해당 Parameter를 원하는 이름으로 Rename해주면 된다. 나는 그냥 Volume으로 명명했다.
Slider를 드래그할 때, 사운드가 조절되도록 만들 것이다. 이때 주의해야할 점은 AudioMixer의 최소 볼륨은 -80, 최대 볼륨은 0이라는 것이다.
따라서 슬라이더를 드래그해서 -80 ~ 0의 값을 산출해야되므로 Log을 이용해서 Slider가 0.0001일 때 -80, 1일때 0이 나오도록 만들자. 그리고 잊지말고 Slider의 최소값은 0.0001, 최대값은 1로 설정해두자. (만약 최소값 최대값 설정을 안하면 기본으로 0~1로 설정되어 있는데, 이러면 Slider의 최소값이 최대볼륨이 되버린다.)
// SetVolume.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;
public class SetVolume : MonoBehaviour
{
public AudioMixer mixer;
private void Start()
{
if (this.gameObject.name == "BgmSlider")
{
GameObject.Find("Canvas").transform.Find("Option/BgmSlider").GetComponent<Slider>().value = SoundManager.instance.bgmVolume;
}
if (this.gameObject.name == "SfxSlider")
{
GameObject.Find("Canvas").transform.Find("Option/SfxSlider").GetComponent<Slider>().value = SoundManager.instance.sfxVolume;
}
}
public void SetLevel(float sliderVal)
{
mixer.SetFloat("Volume", Mathf.Log10(sliderVal) * 20);
if (this.gameObject.name == "BgmSlider")
{
SoundManager.instance.bgmVolume = sliderVal;
}
if (this.gameObject.name == "SfxSlider")
{
SoundManager.instance.sfxVolume = sliderVal;
}
}
}
*bgmVolume, sfxVolume을 SoundManager에서 관리하는 이유는 다음씬에도 설정이 적용될 수 있도록 하기 위함이다.
이제 마지막으로 구현한 스크립트를 Slider에 적용할 것이다. 스크립트를 Slider에 적용하는 것은 매우 간단하다.
먼저 Slider에 SetVolume.cs를 컴포넌트로 넣어준다.
그리고 OnValueChanged 함수에 아래 사진과 같이 SetVolume.cs의 SetLevel을 넣어주면 된다.