유니티 숙련주차 과제를 하다보니 필수구현을 넘어 선택구현으로 게임 전체에 BGM을 넣고싶어졌다. BGM을 넣는 방법은 다양하지만 이번에는 Audio Mixer를 이용해 넣어보았다.
Window >>> Audio >>> Audio Mixer
Groups를 눌러 BGM이라는 믹서를 달아줍니다
본인은 이미 expose를 해두어 출력되지않지만, 여기 unexpose에 Expose 'Volume' to script 가 출력된다.
expose를 클릭하여 원하는 parameter이름을 원하는대로 바꾼다.
gameobject를 추가하고 거기에 audioSource를 달아준다. 원하는 음악 소스를 넣어주고 믹서를 달아준다.
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Audio;
public class AudioController : MonoBehaviour
{
public AudioMixer masterMixer;
public Slider audioSlider;
public Toggle audioToggle;
private const string BGMVolumeKey = "BGMVolume";
private const string AudioMutedKey = "AudioMuted";
private void Start()
{
float savedBGMVolume = PlayerPrefs.GetFloat(BGMVolumeKey, 0f);
bool audioMuted = PlayerPrefs.GetInt(AudioMutedKey, 0) == 1;
audioSlider.value = savedBGMVolume;
audioToggle.isOn = audioMuted;
SetBGMVolume(savedBGMVolume);
SetAudioMuted(audioMuted);
}
public void AudioControl()
{
float sound = audioSlider.value;
PlayerPrefs.SetFloat(BGMVolumeKey, sound);
PlayerPrefs.Save();
SetBGMVolume(sound);
}
public void ToggleAudioVolume()
{
bool audioMuted = audioToggle.isOn;
PlayerPrefs.SetInt(AudioMutedKey, audioMuted ? 1 : 0);
PlayerPrefs.Save();
SetAudioMuted(audioMuted);
}
private void SetBGMVolume(float volume)
{
if (volume == -40f) masterMixer.SetFloat("BGM", -80);
else masterMixer.SetFloat("BGM", volume);
}
private void SetAudioMuted(bool muted)
{
AudioListener.volume = muted ? 0 : 1;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioPlayManager : MonoBehaviour
{
private AudioSource audioSource;
private GameObject[] musics;
private void Awake()
{
musics = GameObject.FindGameObjectsWithTag("BGM");
if(musics.Length>=2)
{
Destroy(this.gameObject);
}
DontDestroyOnLoad(transform.gameObject);
audioSource = GetComponent<AudioSource>();
}
public void PlayMusic()
{
if (audioSource.isPlaying) return;
audioSource.Play();
}
public void StopMusic()
{
audioSource.Stop();
}
}
위의 스크립트들을 Slider, Toggle, MusicSource등에 적절히 넣어주고 맞는 오브젝트들을 배치하여 실행을 시키면 된다.