유니티 BGM넣기

최장범·2023년 9월 21일
0

TIL

목록 보기
32/50

들어가기 앞서..

유니티 숙련주차 과제를 하다보니 필수구현을 넘어 선택구현으로 게임 전체에 BGM을 넣고싶어졌다. BGM을 넣는 방법은 다양하지만 이번에는 Audio Mixer를 이용해 넣어보았다.


Audio Mixer

  • Window >>> Audio >>> Audio Mixer

  • Groups를 눌러 BGM이라는 믹서를 달아줍니다

  • 본인은 이미 expose를 해두어 출력되지않지만, 여기 unexpose에 Expose 'Volume' to script 가 출력된다.

  • expose를 클릭하여 원하는 parameter이름을 원하는대로 바꾼다.

  • gameobject를 추가하고 거기에 audioSource를 달아준다. 원하는 음악 소스를 넣어주고 믹서를 달아준다.


스크립트

  1. audiocontroller 스크립트를 만든다.
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;
    }
}
  • 위의 코드에서 slider를 관리하는 AudioControl메서드 부분을 만든다.
  • ToggleAudioVolume으로 음소거를 다룬다.
  1. audioplaymanager 스크립트를 만든다.
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();
    }
}
  • 위의 스크립트에서는 BGM이 끊기지 않고 다음 씬까지 넘어가게끔 DontDestroyOnLoad를 사용한다.

위의 스크립트들을 Slider, Toggle, MusicSource등에 적절히 넣어주고 맞는 오브젝트들을 배치하여 실행을 시키면 된다.


한 줄 생각

  • 앞으로도 이렇게 고민하면서 찾아보고 공부한 것들을 자세하게 적어두자.

0개의 댓글