본문 바로가기
제출용/TIL

내일배움캠프 49일차 TIL + UI 슬라이더로 볼륨 조절하기

by 유린테 2024. 6. 25.

이거 하나를 하루종일 하다니.......

근데 아직 한참 남았다.

 

유니티에서 UI 슬라이더로 볼륨조절하기

 

먼저, UI 를 이용해서 멋진 슬라이더를 만들어준다.

 

 

사운드 매니저 스크립트를 만들어준다.

사운드는 여기저기서 쓰이기 때문에 싱글톤으로 만들어준다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class SoundManager : MonoBehaviour
{
    public static SoundManager instance;

    public AudioMixer mixer; // BGM과 SFX 볼륨을 조절할 Audio Mixer

    // BGM 사운드 클립들
    public AudioClip casualSuspense;
    public AudioClip casualTheme3Loop;
    public AudioClip tropicalGame;

    // SFX 사운드 클립들
    public AudioClip hover;
    public AudioClip denied;
    public AudioClip unequip;
    public AudioClip buySell;
    public AudioClip hit;
    public AudioClip teleport;
    public AudioClip cannon;
    public AudioClip magic;

    private AudioSource bgmSource; // BGM을 재생할 AudioSource

    public Slider bgmSlider; // BGM 볼륨을 조절할 슬라이더
    public Slider sfxSlider; // SFX 볼륨을 조절할 슬라이더

내가 넣을 사운드 클립들을 넣어주고,

오디오 믹서와 슬라이더 또한 넣어준다.

 

void Awake()
{
    if (instance == null)
    {
        instance = this;
        DontDestroyOnLoad(gameObject);
    }
    else
    {
        Destroy(gameObject);
    }

    // AudioSource 컴포넌트 설정
    bgmSource = gameObject.AddComponent<AudioSource>();
    bgmSource.loop = true; // BGM을 반복 재생하도록 설정
}


BGM이 끊기지 않도록 DontDestroyOnLoad 를 해주고,

배경음악은 계속 루프 되어야 하기 때문에 loop = true 도 해준다

 

 void Start()
 {
     SceneManager.sceneLoaded += OnSceneLoaded; // Scene이 로드될 때 호출할 함수 지정

     InitializeSliders();
     ApplySavedVolumes();
 }

 void InitializeSliders()
 {
     // 슬라이더 초기화
     if (bgmSlider != null)
     {
         bgmSlider.onValueChanged.AddListener(SetBGMVolume);
     }

     if (sfxSlider != null)
     {
         sfxSlider.onValueChanged.AddListener(SetSFXVolume);
     }
 }
 
 void ApplySavedVolumes()
{
    // 저장된 볼륨 적용
    if (bgmSlider != null)
    {
        float savedBGMVolume = PlayerPrefs.GetFloat("BGMVolume", 0.75f);
        bgmSlider.value = savedBGMVolume;
        SetBGMVolume(savedBGMVolume);
    }

    if (sfxSlider != null)
    {
        float savedSFXVolume = PlayerPrefs.GetFloat("SFXVolume", 0.75f);
        sfxSlider.value = savedSFXVolume;
        SetSFXVolume(savedSFXVolume);
    }
}

씬 로드할 때 노래가 나와야 함으로 씬 로드 하면서 볼륨 세이브랑 슬라이더 초기화 관련 코드를 호출해준다.

 

 

void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
    // Scene 이름에 따라 BGM 재생
    switch (scene.name)
    {
        case "IntroScene":
            PlayBGM(casualSuspense);
            break;
        case "Yuyerin":
            PlayBGM(casualTheme3Loop);
            break;
            // 추가적인 Scene이 있으면 여기에 추가할 수 있습니다.
    }

    // 슬라이더 연결 재설정
    InitializeSliders();
    ApplySavedVolumes();
}

어느 씬을 로드하느냐에 따라 다른 BGM 이 나올 것이라

씬 마다 다른 BGM 이 나오도록 배치해주었다.

 

그리고 씬이 바뀌며 슬라이더 연결이 끊길때가 있어 재설정 해줌.

 

    // BGM 재생
    public void PlayBGM(AudioClip bgmClip)
    {
        if (bgmClip == null) return;

        bgmSource.clip = bgmClip;
        bgmSource.outputAudioMixerGroup = mixer.FindMatchingGroups("BGM")[0]; // Audio Mixer 설정 적용
        bgmSource.Play();
    }

    // SFX 재생
    public void PlaySFX(AudioClip sfxClip)
    {
        if (sfxClip == null) return;

        AudioSource.PlayClipAtPoint(sfxClip, Camera.main.transform.position);
    }

    // 볼륨 조절
    public void SetBGMVolume(float volume)
    {
        if (volume == 0)
        {
            mixer.SetFloat("BGMVolume", -80f); // 볼륨을 최소로 설정 (음소거)
        }
        else
        {
            mixer.SetFloat("BGMVolume", Mathf.Log10(volume) * 20);
        }
        PlayerPrefs.SetFloat("BGMVolume", volume);
    }

    public void SetSFXVolume(float volume)
    {
        if (volume == 0)
        {
            mixer.SetFloat("SFXVolume", -80f); // 볼륨을 최소로 설정 (음소거)
        }
        else
        {
            mixer.SetFloat("SFXVolume", Mathf.Log10(volume) * 20);
        }
        PlayerPrefs.SetFloat("SFXVolume", volume);
    }

볼륨을 0일 때 지정을 안해줬더니 0으로 만들면 다시 최대소리가 되는 오류가 생겨

0일때 소리를 확 줄여서 소리가 꺼진 것 처럼 만들어주었다.

 

그리고 사운드매니저 스크립트에 이렇게 해당하는 것들을 넣어준다.

 

오디오 믹서는 이렇게 만들어 주었고,

Exposed Parameters 를 설정해주어야 한다.

이게 노출된 변수? 같은거라 스크립트에서 쓰는 이름과 똑같은 이름으로 해주어야 연결이 된다.

 

 

이게 오류가 너무 많았어서 하루종일 작업해서 겨우 BGM만 만들어냈다.

사실 아직... 문제인 부분이 있긴 한데 시간이 없어서 SFX로 넘어간다.

사운드매니저 부분은 다음에 더 공부해봐야지