관리 메뉴

有希

Sound Manager 본문

프로그래밍/UnityEngine기초

Sound Manager

有希. 2021. 9. 4. 23:19

//MP3 Player -> AudioSource(소리를 발생), 음원->AudioClip, 듣는사람->AudioListener

Player가 음원을 재생하면 듣는사람이 이걸 듣는다(소리가 나온다). 한 씬에 하나만 리스너가 있으면 됨.

Audio를 알아서 삭제되게 하고 싶으면, float을 하나 선언한 뒤, 이를 Destroy에 넣어줘 float시간 이후 알아서 삭제되게 한다.

오디오소스 같은 것을 오브젝트가 들고 있는 것이 맞는가? 오브젝트가 파괴되면 사라져버릴텐데. -> 사운드 매니저로 옮긴다.

DontDestroyOnLoad를 통해서 씬을 옮겨도 사라지지 않게 한다. (모든 씬에서 재활용)

오디오를 매번 불러올 수 없으니 caching을 해야한다. dictionary를 이용해서 GetOrAdd 함수를 만든다. _Dic.TryGetValue를 해서 가져왔는데 있으면 return하면 되고,

없으면 Managers.Resource.Load함수를 통해서 path를 인자로 넘겨주고(GetOrAddstring path를 받도록 만든다.) 이를 audioClip으로 받는다.(제네릭활용)

 

그런데, 새로운 오브젝트가 생길때마다 사운드가 추가되면서 사운드매니저의 dic 크기가 점점 커지고, DontDestroyOnLoad가 적용되어 있어 이 dic은 메모리를 계속해서 점유해나간다. 이렇게 계속되다 보면 언젠가는 메모리가 터지거나 할 수 있으므로 dic을 적절하게 clear해주어야 한다.

씬이 이동하고, 필요가 없다면 이를 foreach문으로 null로 해준뒤, stop을 해주고 마지막에 dic.Clear()를 통해 싸그리 비워주면 된다. 그럼 Clear를 언제 호출하냐? 다른 Clear함수들도 있을테니, Managers 클래스에서 통째로 다른 매니저들의 clear들도 호출해서 한 번에 처리해주도록 한다. , 씬마다 clear를 호출해준다. 그 이전에는 계속 쌓아두는 것. KeyAction=null, MouseAction=null, 등등이렇게 한 뒤, 씬매니저에서 ManagersClear함수를 호출하면 다른 녀석들의 clear도 다 호출되서 자동으로 클리어 된다.

 

2D 사운드: 시야에 보이면 소리가 들리고 벗어나면 소리가 안들리고

3D 사운드: 물체가 멀어질수록 소리가 작게 들림.

Playoneshot을 하게 되면 채널링이 끊기게 되면 소리도 끊겨야 하는데 이거로는 조금 애매함.

Audio Source속성 중에서 Spatial Blend3D로 바꾸면 3D사운드를 지원함. 아래 그래프를 보면 이거는 거리에 따라서 소리가 어떻게 들릴지 보여주는 그래프. 리스너가 Min ~ Max Distance 사이에 있으면 소리가 들린다. 점점 범위를 벗어나면 설정한 그래프에 따라 소리가 줄어들거나 커짐.

 

PlayClipAtPoint로 원하는 오디오를 world좌표로 받아서 해당위치에서 재생할 수 있다.

'프로그래밍 > UnityEngine기초' 카테고리의 다른 글

Coroutine  (0) 2021.09.04
Object Pooling  (0) 2021.09.04
Scene Manager  (0) 2021.09.04
UI_Manager  (0) 2021.09.04
Extension 클래스  (0) 2021.09.04