게임개발 캠프 38일차

IIRU·2026년 7월 8일

SoundManager.cs

using UnityEngine;
using UnityEngine.Rendering;

public class SoundManager : MonoBehaviour
{
    public static SoundManager instance;

    [SerializeField] AudioSource BGMSource;
    [SerializeField] AudioSource SFXSource;


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

    private void Start()
    {
        SetBgmVolume(PlayerPrefs.GetFloat("BGMVolume", 1));
        SetSfxVolume(PlayerPrefs.GetFloat("SFXVolume", 1));
    }


    public void SetBgmVolume(float volume)
    {
        BGMSource.volume = volume;
        PlayerPrefs.SetFloat("BGMVolume", volume);
    }
    public void SetSfxVolume(float volume)
    {
        SFXSource.volume = volume;
        PlayerPrefs.SetFloat("SFXVolume", volume);
    }
    public float GetBgmVolume()
    {
       return BGMSource.volume;
    }
    public float GetSfxVolume()
    {
        return SFXSource.volume;
    }
}

OptionPanel.cs

using UnityEngine;
using UnityEngine.UI;

public class OptionPanel : MonoBehaviour
{

    public Button closeBtn;
    public Slider bgmSlider;
    public Slider sfxSlider;


    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        bgmSlider.onValueChanged.AddListener(BGMVolumeChanged);
        sfxSlider.onValueChanged.AddListener(SFXVolumeChanged);
        closeBtn.onClick.AddListener(UIManager.Instance.CloseOptionPanel);
    }

    private void OnEnable()
    {
        bgmSlider.value = SoundManager.instance.GetBgmVolume();
        sfxSlider.value = SoundManager.instance.GetSfxVolume();
    }
    public void BGMVolumeChanged(float vol)
    {
        SoundManager.instance.SetBgmVolume(vol);
    }

    public void SFXVolumeChanged(float vol)
    {
        SoundManager.instance.SetSfxVolume(vol);
    }

    public void CloseOptionPanel()
    {
       gameObject.SetActive(false);
    }
}

UIManager.cs

using UnityEngine;

public class UIManager : MonoBehaviour
{

    public static UIManager Instance;

    [SerializeField]GameObject option;
    GameObject optionPanel;
    [SerializeField] GameObject dim;
    [SerializeField] Canvas canvas;

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

    public void OpenOptionPanel()
    {
        // 1. 아까 만든 프리펩을 이요해서 옵션창을 열때마다 오브젝트 생성
        //
        // 2. 지금 있는 옵션창을 활성화 하기
        //
        if(optionPanel == null)
        {
            optionPanel = Instantiate(option, canvas.transform);
        }
        else
        {
            optionPanel.SetActive(true);
        }
        dim.SetActive(true);
        dim.transform.SetAsLastSibling();
        optionPanel.transform.SetAsLastSibling();
        //dim.transform.SetSiblingIndex(1);
    }
    public void CloseOptionPanel()
    {
        optionPanel.SetActive(false);
        dim.SetActive(false);
    }

}

slider로 볼륨 조절

볼륨을 SoundManager에서 가져오거나 설정할 수 있도록 해주는 함수

 public void SetBgmVolume(float volume)
 {
     BGMSource.volume = volume;
     PlayerPrefs.SetFloat("BGMVolume", volume);
 }
 public void SetSfxVolume(float volume)
 {
     SFXSource.volume = volume;
     PlayerPrefs.SetFloat("SFXVolume", volume);
 }
 public float GetBgmVolume()
 {
    return BGMSource.volume;
 }
 public float GetSfxVolume()
 {
     return SFXSource.volume;
 }

slider에 붙여줄 함수

public void BGMVolumeChanged(float vol)
{
    SoundManager.instance.SetBgmVolume(vol);
}

public void SFXVolumeChanged(float vol)
{
    SoundManager.instance.SetSfxVolume(vol);
}

start에서 addListener

 void Start()
 {
     bgmSlider.onValueChanged.AddListener(BGMVolumeChanged);
     sfxSlider.onValueChanged.AddListener(SFXVolumeChanged);
     closeBtn.onClick.AddListener(UIManager.Instance.CloseOptionPanel);
 }

Player Prefabs

미리 플레이어프리펩으로 설정을 해두면 게임을 다시 켜거나 재실행을 하더라고 설정값이 저장된다.

PlayerPrefs.SetFloat("BGMVolume", volume);

BgmVolume을 프리펩에서 가져오는데 없을경우 1을 가져오겠다는 의미

SetBgmVolume(PlayerPrefs.GetFloat("BGMVolume", 1));
SetSfxVolume(PlayerPrefs.GetFloat("SFXVolume", 1));
profile
초보 개발자 블로그입니다!

0개의 댓글