유니티 Slider로 Volume 조절하기

Amberjack·2024년 1월 29일
0

Unity

목록 보기
21/44
post-custom-banner

🔈 Slider 만들기

일단 볼륨을 조절하기 위한 Slider를 만들어 준다.

🔉 AudioMixer 만들기

그리고 AudioMixer를 만들어 준다.

이후, AudioMixer Group을 새로 생성하고, 용도에 맞춰 이름을 변경해준다.

그 다음, 사용하고자 하는 Group의 Attenuation에서 Volume을 우클릭, Expose 'Volume (of 그룹 이름)' to script를 설정

Volume 옆에 화살표가 생기면 완료.

마지막으로 오른쪽 위의 Exposed Parameters에서 방금 설정한 Group에 맞춰 parameter의 이름을 변경해준다.

이 설정을 통해 코드에서 해당 parameter를 찾아 수정해줄 수 있다.

이후 AudioManager 혹은 SoundManager에게 AudioSource를 붙여주고, Output에 방금 생성한 AudioMixer를 연결한다.

🖥️ AudioMixController.cs

다음으로, 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도 변경되는 것을 확인할 수 있다.

post-custom-banner

0개의 댓글