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;
}
}
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);
}
}
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);
}
}
볼륨을 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);
}
미리 플레이어프리펩으로 설정을 해두면 게임을 다시 켜거나 재실행을 하더라고 설정값이 저장된다.
PlayerPrefs.SetFloat("BGMVolume", volume);
BgmVolume을 프리펩에서 가져오는데 없을경우 1을 가져오겠다는 의미
SetBgmVolume(PlayerPrefs.GetFloat("BGMVolume", 1));
SetSfxVolume(PlayerPrefs.GetFloat("SFXVolume", 1));