사운드 구현
- 사운드를 구현하려면 소리를 내는 파트(Audio Source)와 소리를 듣는 파트(Audio Listener) 그리고 음원 파일(Audio Clip)이 필요하다
- 유니티로 import된 음원 파일을 오디오 클립이라고 부른다
- 오디오는 일반적으로 Singleton 방식을 이용해서 하나의 게임오브젝트가 사운드 출력을 총괄하도록 관리한다
AudioListener 컴포넌트
- 이 컴포넌트는 Main Camera에 기본 컴포넌트로 미리 추가되어 있다. 이 컴포넌트에 대해서는 별도로 속성을 이용해 제어할 수 없다
- 이 컴포넌트는 모든 게임오브젝트에 붙일 수 있지만 일반적으로 게임세계를 바라보는 유저의 눈에 해당하는 카메라 게임오브젝트에 포함되는 게 좋으며 조작하고 있는 캐릭터에 붙이기도 한다
- Audio Listener는 씬 내에 하나만 존재해야 한다(카메라가 여러 대인 경우 Audio Listener가 모든 카메라에서 활성화되어 있지는 않은지 꼭 확인하자). 반대로 Audio Source는 씬 내에 여러 개가 있을 수 있다
Audio Source 컴포넌트 1
Audio Source 컴포넌트 2
Audio Source 컴포넌트
- 씬 내에서 음원을 재생하는 컴포넌트
AudioClip: 재생할 음원 파일
Output: 재생되는 음원의 출력을 특정 Audio Listener 또는 Audio Mixer로 설정(?)
Mute: 음원이 재생되고 있는 상태로 음소거시킨다
Bypass Effects: 모든 Filter effects를 즉시 켜거나 끈다
Bypass Listener Effects: 모든 Listener effects를 즉시 켜거나 끈다
Bypass Reverb Zones: 모든 Reverb Zones를 즉시 켜거나 끈다
Play On Awake: 컴포넌트가 활성화 상태일 때 씬 실행과 동시에 음원을자동재생한다. 체크해제할 경우 스크립트에서 Play 함수로 재생할 수 있다
Loop: 반복재생 여부 설정
Priority: 씬 내의 여러 음원들 중에서 재생 우선순위 설정. default는 128이며 0이 최우선 순위, 256이 마지막 순위이다
Volume: Audio Listener로부터 1유닛(=1미터) 만큼 떨어지 거리에 있을 때를 기준으로 볼륨 설정
Pitch
Stereo Pan
Spatial Blend: 3D엔진이 Audio Source에 영향을 주는 정도를 설정
Reverb Zone Mix
3D Sound Settings: Spatial Blend에 값에 따라 비례적으로 영향을 받는다
Doppler Level: doppler effect의 적용 정도를 설정
Spread: 3D 스테레오나 멀티채널 사운드일 경우 스피커 공간에서의 spread angle을 조절
Volume Rolloff: Audio Source로부터 거리가 멀어질수록 볼륨이 감소하는 세 가지 Preset 옵션을 제공. 하단의 Curved Editor에서 감소 효과를 세부적으로 조절 가능
Min Distance: 볼륨을 100%로 들을 수 있는 범위. 3D공간에서 소리를 '더 크게' 만드려면 값을 높인다. 이 범위를 벗어나면 소리가 점점 줄어든다
Max Distance: 볼륨을 50% 이상으로 들을 수 있는 최대 범위. 즉, Max Distance 를 벗어나면 볼륨이 더 이상 감소하지 않고 50%로 들린다
Audio Clip의 인스펙터 뷰
Audio Clip
Force To Mono: 멀티채널(스테레오 포함) 음원을 싱글채널(모노)로 변환한다(down-mixing). 변환 후에는 기존 음원보다 소리가 작아지므로 데이터를 peak-
normalize 한다
Normalize: 변환 과정에서 normalize 여부를 설정
Load In Background: 체크하면 오디오 클립의 로드를 메인 쓰레드가 아닌 별개의 쓰레드에서 delayed time에 진행하므로 메인 쓰레드를 block하지 않는다. 유니티는 씬이 플레이되기 전에 씬 내에서 사용할 모든 오디오 클립을 로드해놓도록 기본설정되어 있으므로 이 속성은 default로 체크해제 되어 있다. Audio Clip 컴포넌트가 Background에서 음원을 로드하는 중이면 음원 로드를 완료할 때까지 컴포넌트는 작동이 지연된다
Ambisonic: 음원파일에 Ambisonic-encoded audio가 포함된 경우 체크. Listener의 방향orientation에 따라 회전하는 soundfield를 지원하는 포맷으로 음원을 저장
한다. XR이나 360도 영상에서 유용하게 사용된다
Load Type: 유니티가 실시간으로 음원을 불러올 때 사용할 방식을 설정
Decompress On Load: 오디오 파일을 압축되지 않은 상태로 메모리에 올리는 방식. 용량이 큰 오디오 파일은 성능상 오버헤드를 발생시키므로 용량이 작은 오디오 파일에
적합하다. 메모리는 많이 사용하지만, CPU 자원은 덜 소모한다
Compressed In Memory: 오디오 파일을 압축된 상태로 메모리에 올리는 방식. 실행할 때 압축을 해제하기 때문에 약간의 성능상 오버헤드를 발생시킨다. 큰 사이즈의
오디오 파일에 적합하다. 품질을 떨어뜨리면 파일크기를 줄일 수 있으므로 음질손상이 없는 범위 내에서 적절하게 Quality 값 설정
Streaming: Persistent Memory(HDD, Flash Driver)에 저장된 오디오 파일을 스트리밍 방식으로 재생한다. 따라서 오디오 파일을 저장하기 위한 메모리가 필요 없다
Preload Audio Data: 씬이 로드될 때 씬에서 사용할 모든 오디오 클립도 미리 로드하도록 설정. default로 체크되어 있다. 체크해제할 경우 AudioSource.Play/PlayOneShot 함수가 처음 호출되는 시점에 음원이 로드된다. 또는 AudioSource.LoadAudioData 함수로 원하는 시점에 로드하고 AudioSource.UnloadAudioData 함수로 언로드할 수 있다. 오디오 클립을 처음 재생하는 시점에 음원이 로드될 경우 렉이 발생할 수 있다는 점을 유의하자
Compression Format: 압축 포맷은 오디오 파일의 용도에 따라 다르게 설정해야 한다. 유니티에서 지원하는 오디오 압축 포맷의 종류는 다음과 같다
PCM: 음질이 좋은 대신 파일의 크기가 비교적 크기 때문에 효과음처럼 재생시간이 짧은 오디오 파일에 적합하다(비압축 포맷)
ADPCM: 압축률이 PCM 대비 3.5배이기에 파일의 크기가 작아서 메모리는 덜 쓸 수 있는 반면 CPU 자원은 좀 더 사용한다. 노이즈가 발생하기에 노이즈가 약간 있더라도
크게 상관 없는 총 소리나 발걸음 소리 같은 음원에 적합하다
Vorbis / MP3: 중간길이 정도의 효과음 또는 배경음악에 적합하다. PCM에 비해 음질은 떨어지지만 압축률(Quality 설정)을 조절할 수 있다. 압축률이 100%이면 PCM
과 동일해진다. 보통 70% 정도로 설정
*Vorbis의 Quality 값을 낮추게 되면 압축이 일어나므로 값을 다시 올리더라도 원래 상태로 돌아오지 않는다(다시 로드해야함)
HEVAG: PS Vista 고유의 압축 포맷으로 ADPCM과 유사하다
Quality: 압축되는 오디오 클립에 대한 압축률 설정. Vorbis 포맷에만 적용된다
Sample Rate Setting
Preserve Sample Rate: default 설정. 기존 음원파일의 sample rate를 유지
Optimize Sample Rate: 음원파일을 분석해서 가장 높은 주파수에 맞게 sample rate를 최적화
Override Sample Rate: sample rate를 수동으로 override 한다
오디오 설정 팁
- import한 오디오 클립은 2개의 채널로 이뤄져 있다(스테레오 방식. 각 채널은 좌,우 스피커로 구분해서 소리를 따로 보낸다). 그러나 음향 효과를 극대화한 게임이 아니라면 모노(소리의 방향구분 X)로 변환하는 걸 권장한다. 특히 모바일 게임의 경우 스테레오 사운드는 용량 부족과 성능 저하의 원인이 될 수 있다
*유니티는 스테레오, 모노 방식 외에도 최대 8개까지의 멀티채널을 지원한다
- raw 파일 음원은 용량이 크다. wav 파일은 용량이 크지만 바로 출력할 수 있기에 실행속도가 빠르다. mp3 파일은 용량이 작지만 압축 해제한 후 출력되기에 실행속도가 상대적으로 느리다(딜레이 발생) *유니티는 aif, wav, mp3, ogg 포맷의 음원을 지원한다
1. wav 파일: 즉시 출력돼야 하는 효과음(칼이나 총알의 충돌 등)에 사용
2. mp3 파일: 약간의 딜레이가 허용되는 인물의 대사나 배경음악에 사용
- 배경음악이나 환경음은 대부분 용량이 크기에 실행시 미리 압축을 풀어서 메모리에 보관할 경우 가용 메모리가 줄어든다. 따라서 용량이 큰 음원은 다음과 같은 import 설정을 권장한다
1. Streaming+Vorbis
2. Compressed in Memory+Vorbis+Quality(70%)
- 오디오의 발생 빈도나 오디오 파일의 크기에 따라서는 다음과 같은 import 설정을 권장한다
1. 자주 발생하며 파일크기가 작은 경우: Decompress On Load+PCM(or ADPCM)
2. 자주 발생하며 파일크기가 중간인 경우: Compressed in Memory+ADPCM
3. 가끔 발생하며 파일크기가 작은 경우: Compressed in Memory+ADPCM
4. 가끔 발생하며 파일크기가 중간인 경우: Compressed in Memory+Vorbis
- 음원은 import될 때 설정된 플랫폼(build target)에 적합한 타입(Load Type)으로 변환(re-encode)된다(default는 Decompress On Load+Vorbis). Load Type은 원본을 크게 손상시키지 않는 PCM이나 Vorbis/MP3 타입이 주로 쓰인다. PCM은 비압축포맷이기에 메모리에서 바로 읽어들일 수 있으므로 CPU의 부담이 덜하다. Vorbis/MP3 포맷은 불필요한 소리 정보를 잘라내는 방식으로 압축한다. ADPCM은 메모리 성능과 CPU 성능 사이에서 타협한 방식인데, PCM에 비해 CPU를 살짝 더 사용하지만 꽤 많이 압축되기에 메모리 부담을 줄인다.
Scripting API
AudioSource
public AudioClip clip: 재생할 default 오디오 클립. 다음에 재생할 오디오 클립을 clip에 담는 방법은 아래 코드 참고
public void PlayOneShot(AudioClip clip, float volumeScale = 1.0F)
- 오디오 클립(첫 번째 인수)을 특정 볼륨값(두 번째 인수)으로 재생한다. 볼륨값은 0에서 1사이의 실수로 설정
public void Play(ulong delay = 0)
- clip속성에 저장된 오디오 클립을 재생한다
- 인수는 재생하기까지 딜레이를 부여하는 값인데, 현재는 잘 사용되지 않고 PlayDelayed 함수로 대체해서 사용한다
public void Stop()
- 오디오 클립 재생을 멈춘다. 다시 Play할 경우 처음부터 재생한다
public void Pause()
- 오디오 클립 재생을 일시정지한다
public void UnPause()
- 일시정지된 오디오 클립을 정지된 시점부터 다시 재생한다
- Play 함수도 일시정지된 오디오 클립을 재생시킬 수 있다. 단, Play 함수는 어떤 상태의 오디오 클립에 대해서도 재생하도록 만들지만(create a new playback voice),
UnPause 함수는 일시정지된 상태가 아닌 오디오 클립을 재생할 수는 없다
*진폭은 소리의 크기, 진동수는 소리의 높낮이를 의미한다. 짧은 시간 동안 진동수가 많은 것은 고음을 의미한다
*압축된 음원파일은 가청영역대 이외의 부분을 잘라낸 후 아날로그 정보를 비슷한 주파수끼리 묶어서 디지털화한 것
ref : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dj3630&logNo=221461311485
<참고자료>
- 이재현, <절대강좌! 유니티>, 2018
- https://docs.unity3d.com/Manual/class-AudioSource.html
'게임엔진(GameEngine) > Unity3D' 카테고리의 다른 글
Unity vertex / fragment Shader01 -빨강 쉐이더 (0) | 2022.12.02 |
---|---|
Keyword Boolean (0) | 2022.11.27 |
UnityEngine.Random (0) | 2022.11.16 |
UI 버튼 바인딩 (1) | 2022.11.06 |
앵커 (0) | 2022.11.06 |