[Unity] Audio (오디오) / 소리 재생하기

⭐ Audio

게임을 플레이하다 보면 UI, 이펙트, 카메라 연출 등을 통하여 유저에게 시각적인 정보를 주기도 하지만,

몬스터 공격 효과음, 불이 나는 소리, 브금 등을 통해 청각적인 정보를 주기도 합니다.

청각적인 정보를 통해서 플레이어는 공격을 받고 있고, 주변에 먹을 수 있는 템이 있다거나, 급박한 상황임을 알아채는

등의 쾌적한 플레이를 할 수 있게 됩니다.

 

오디오를 재생하기 위해선 오디오를 재생하는 역할인 Audio Source, 재생될 오디오 파일인 Audio Clip

Audio Source로 부터 재생되는 소리를 듣고 사용자에게 송출할 Audio Listener로 구성되어 있습니다.

 

 

 

 

Audio Listener


오디오 소스로부터 정보를 받아 사운드를 재생하는 역할을 합니다.

Main Camera 컴포넌트에 자동으로 추가되어 있습니다.

오디오가 재생될 때 소리를 듣는 근원지로 보통 Main Camera에 자동으로 추가되어 있습니다.

 

 

 

 

 

Audio Source


● Audio Clip을 재생하는 역할을 수행합니다.

● 오브젝트의 컴포넌트로 추가할 수 있으며, 볼륨, 음향 타입(2D, 3D), 반복 설정 등의 속성을 정의할 수 있습니다.

 

 

💡Audio Source 컴포넌트 속성

Audio Source 컴포넌트

● Audio Resource: 재생할 Audio Clip

 

● Output: 클립이 재생될 출력 장치 (디폴트 값은 Audio Listener)

 

● Mute: 음소거 여부

 

● Bypass Effects: Audio Source에 적용된 필터 효과를 끄거나 키는 옵션

 

● Bypass Listener Effects: 모든 리스너 효과를 끄거나 키는 옵션

 

● Bypass Reverb Zones: 모든 Reverb Zones(잔향 효과)를 끄거나 키는 옵션

 

● Play On Awake: 씬이 실행되는 시점에 사운드를 재생할지 정하는 옵션

 

● Loop: Audio Clip을 반복 재생할 지 정함

 

● Priority: Audio Source의 우선 순위를 결정 (최우선 순위 → 0 / 최하위 순위 → 256 / 디폴트 값 → 128)

우선 순위가 높은 Audio Source일 수록 먼저 유지하고 늦게 끊음

 

● Volume: Audio Listener로부터 1m(1월드 유닛) 거리에서 소리가 얼마나 크게 들릴지 정의

 

● Pitch: Audio Clip의 재생 속도 (디폴트 값 → 1)

 

● Stereo Pan: 소리가 재생될 때 좌우 스피커 간의 소리 분포를 조절하는 옵션

(-1 → 왼쪽 스피커에서만 들림 / 0 → 양쪽에서 균등하게 들림 / 1 → 오른쪽 스피커에서만 들림)

 

● Spatial Blend: 소리가 2D처럼 들릴지, 3D처럼 들릴지 정하는 옵션

(0 → 2D, 어디서나 볼륨이 같음 / 1 → 3D, 소리 근원지에서의 거리에 따라 볼륨이 달라짐)

 

● Reverb Zone Mix: 리버브 존으로 보내지는 출력 신호의 양을 설정

(0 → 리버브 존 영향 없음 / 1 → 리버브 존 영향 최대 적용 / 1.1 → 10dB 증폭)

 

● 3D Sound Settings: Spatial Blend 값이 1일 때 (3D 음향일 때) 설정할 속성 값들 (0 → 효과 적용 X)

    ○ Doppler Level: 도플러 효과(소리가 움직이는 속도, 거리에 따라 높낮이가 바뀌는 효과) 설정

    ○ Spread: 스피커에 얼마나 퍼져 들릴지 (0 → 점 형태의 소리 / 360 → 모든 방향에서 소리가 퍼져 나옴)

    ○ Volume Rollof: 소리가 거리에 따라 어떻게 감소될지 정하는 모드

         Logarithmic Rolloff: 가까우면 사운드가 크고, 멀면 상당히 빠른 속도로 사운드가 작아짐

Logarithmic Rolloff

        

        ■ Linear Rolloff: 멀어질수록 사운드가 점점 작아짐

Lonear Rolloff

 

         Custom Rolloff: 사용자가 직접 정의한 롤오프 그래프에 설정한 대로 작동

Custom Rolloff

 

    ○ Min Distance: 소리가 최대 볼륨으로 들리는 최소 거리, 이 거리를 넘어가면 볼륨이 작아지기 시작

    ○ Max Distance: 소리가 더 이상 들리지 않게 되는 거리

 

 

 

Audio Clip


재생될 오디오 파일입니다.

Audio Source에 추가해 재생할 수 있습니다.

 

 

 

 

소리 재생하기


● SoundManager.cs

using System;
using UnityEngine;
using UnityEngine.SceneManagement;

public enum SoundType
{
    BGM,            //배경음
    SoundEffect,    //효과음
}

public class SoundManager : Singleton<SoundManager>
{
    [SerializeField] private AudioSource bgmAudioSource;
    [SerializeField] private AudioSource soundEffectAudioSource;

    public event Action<SoundType, float> onChangedVolume;

    private void Awake()
    {
        SingletonInit();
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    public void PlayBGM(AudioClip clip)
    {
        if (bgmAudioSource == null || clip == null) return;

        //클립을 넣어주고 재생
        bgmAudioSource.clip = clip;
        bgmAudioSource.Play();
    }

    public void PlaySoundEffect(AudioClip clip)
    {
        if (soundEffectAudioSource == null || clip == null) return;

        //PlayOneShot = 일회성 재생
        soundEffectAudioSource.PlayOneShot(clip);
        transform.position = Camera.main.transform.position;
    }

    public void SetSoundVolume(SoundType type, float volume)
    {
        switch(type)
        {
            case SoundType.BGM:
                bgmAudioSource.volume = volume;
                onChangedVolume?.Invoke(SoundType.BGM, bgmAudioSource.volume);
                break; ;
            case SoundType.SoundEffect:
                soundEffectAudioSource.volume = volume;
                onChangedVolume?.Invoke(SoundType.SoundEffect, soundEffectAudioSource.volume);
                break;
        }
    }

    //씬이 로드될 때 실행할 메서드
    public void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        //Audiosource가 플레이 중이라면 중지시킴
        StopAudioSource(bgmAudioSource);
        StopAudioSource(soundEffectAudioSource);
    }

    private void StopAudioSource(AudioSource source)
    {
        if(source != null &&  source.isPlaying)
        {
            source.Stop();
        }
    }

    private void OnDestroy()
    {
        SceneManager.sceneLoaded -= OnSceneLoaded;
    }
}

● 싱글턴을 이용해서 어디서든 쉽게 소리를 재생할 수 있게 만든 유틸 클래스입니다.

● 브금과 효과음을 재생하는 Audio Source를 각각 직렬화합니다.