0:00:00.394,0:00:03.541 Unity에서는 Snapshot을 사용해 0:00:03.541,0:00:05.541 오디오 믹서 에셋의 상태(State)를 0:00:05.849,0:00:07.849 저장하고 불러올 수 있습니다. 0:00:08.868,0:00:12.093 이 Audio Mixer의 Master Mixer에는 0:00:12.093,0:00:15.105 두 개의 스냅샷이 생성되어 있는데, 0:00:15.355,0:00:18.600 이 경우에는 Unpaused와 Paused입니다. 0:00:19.071,0:00:22.115 Unpaused에는 레벨들이 설정되어 있고, 0:00:22.115,0:00:25.195 Cutoff freq의 차단 주파수도 0:00:25.195,0:00:27.195 설정되어 있습니다. 0:00:27.195,0:00:30.156 이 경우는 22000hz이죠. 0:00:31.050,0:00:34.041 Paused 스냅샷을 클릭하면 0:00:35.022,0:00:37.660 Cutoff freq를 0:00:37.660,0:00:41.067 365hz로 새로 지정해 둔 것이 보입니다. 0:00:41.067,0:00:43.067 이렇게 되어 있으면 0:00:43.067,0:00:45.067 Master Mixer의 Music 그룹에서 실행되는 0:00:45.067,0:00:48.477 음악 트랙의 높은 주파수를 감쇠하게 됩니다. 0:00:48.477,0:00:50.836 Esc 키를 누르면 0:00:50.836,0:00:53.975 음악 트랙이 저역 필터링될 겁니다. 0:00:53.975,0:00:55.143 그럼 한 번 확인해 보겠습니다. 0:00:57.379,0:00:59.379 Esc를 누르면 음악 트랙이 0:00:59.379,0:01:01.763 저역 필터링되고, 다시 누르면 (원래대로 돌아옵니다). 0:01:05.485,0:01:07.485 새로운 Snapshot을 생성하려면 0:01:07.485,0:01:09.881 Snapshot 영역의 + 버튼을 클릭합니다. 0:01:09.881,0:01:12.326 이제 Unpaused의 사본을 만들었으니 0:01:13.189,0:01:15.815 원하는 값을 설정할 수 있습니다. 그런 다음에 0:01:17.988,0:01:20.869 스냅샷 이름을 클릭하여 0:01:20.869,0:01:22.869 그 값들을 에디터에서 소환할 수 있습니다. 0:01:22.869,0:01:27.097 런타임에서 스냅샷 값을 불러오려면 0:01:27.097,0:01:30.158 TransitionTo 함수를 사용합니다. 0:01:30.158,0:01:33.921 TransitionTo는 초 단위의 float 변수를 사용하며, 0:01:34.258,0:01:36.738 한 스냅샷과 다른 스냅샷 사이를 0:01:36.738,0:01:39.751 보간할 수 있습니다. 0:01:39.751,0:01:42.293 TransitionTo는 0:01:42.293,0:01:45.089 현재 트랜지션하려고 하는 0:01:45.089,0:01:47.089 Audio Mixer 스냅샷에서 호출합니다. 0:01:47.858,0:01:50.447 이 프로젝트에서는 0:01:50.447,0:01:52.216 MenuCanvas라는 게임 오브젝트가 있습니다. 0:01:52.610,0:01:54.765 MenuCanvas에는 0:01:55.092,0:01:57.092 PauseManager라는 스크립트가 붙어 있습니다. 0:01:57.092,0:01:59.960 Monodevelop에서 PauseManager를 살펴보겠습니다. 0:01:59.960,0:02:01.960 PauseManager에는 0:02:01.960,0:02:06.034 네임스페이스 선언 using UnityEngine.UI와 0:02:06.034,0:02:08.513 using UnityEngine.Audio가 추가되었습니다. 0:02:08.513,0:02:10.513 또한 0:02:10.513,0:02:13.295 현재 Unity 에디터를 사용하고 있는지 점검하고, 0:02:13.295,0:02:15.295 만일 그렇다면 0:02:15.295,0:02:17.527 UnityEditor 네임스페이스를 포함시킬 것입니다. 0:02:19.074,0:02:21.499 클래스 안에서는 두 개의 0:02:21.499,0:02:24.606 AudioMixerSnapshot형 public 변수 paused 0:02:24.856,0:02:27.602 와 unpaused를 선언했습니다. 0:02:27.602,0:02:30.734 또한 Canvas형 변수 0:02:30.734,0:02:32.312 canvas를 선언했습니다. 0:02:32.312,0:02:34.312 Start 함수에서는 GetComponent를 사용해 0:02:34.312,0:02:37.750 레퍼런스를 canvas 컴포넌트에 연결합니다. 0:02:39.462,0:02:42.520 Update 함수에서는 Esc 키가 눌러졌는지 0:02:42.520,0:02:44.145 확인합니다. 0:02:44.145,0:02:46.145 Esc 키가 눌러졌으면 0:02:46.145,0:02:47.944 canvas의 활성화 상태를 0:02:48.454,0:02:51.077 만일 Disabled이면 Enabled로, 0:02:51.077,0:02:53.077 Enabled이면 Disabled로 변경합니다. 0:02:53.510,0:02:56.142 또한 Pause 함수를 호출합니다. 0:02:56.142,0:02:58.603 Pause에서는 0:02:58.603,0:03:00.603 Time.timeScale이 0:03:00.603,0:03:02.603 0인지 확인합니다. 0:03:02.603,0:03:05.762 만일 0이 아니라면 0으로 설정하고, 0:03:06.127,0:03:08.310 0이라면 1이 되게 합니다. 0:03:09.108,0:03:12.165 다음으로는 Lowpass 함수를 호출합니다. 0:03:14.030,0:03:16.741 Lowpass 함수도 역시 0:03:16.741,0:03:19.203 Time.timeScale이 0과 같은지 확인합니다. 0:03:19.203,0:03:23.089 0이면 TransitionTo 함수를 0:03:23.089,0:03:25.301 Paused 스냅샷에서 호출합니다. 0:03:25.301,0:03:27.301 부동소수점 파라미터 0:03:27.301,0:03:29.618 timeToReach를 파싱할 텐데, 0:03:29.618,0:03:31.829 이 경우에는 0.01초입니다. 0:03:31.829,0:03:35.185 Time.timeScale이 0이 아니면 0:03:35.445,0:03:37.522 TransitionTo 함수를 0:03:37.522,0:03:40.071 Unpaused 스냅샷에서 호출하고, 0:03:40.071,0:03:42.410 이번에도 똑같이 0:03:42.410,0:03:45.050 0.01초 파라미터를 0:03:45.050,0:03:47.194 트랜지션 진행 시간이 되도록 파싱합니다. 0:03:47.723,0:03:50.883 public 함수 Quit으로 0:03:50.883,0:03:53.211 UnityEditor를 사용하는지 아닌지를 확인하고, 0:03:53.211,0:03:55.584 만일 사용한다면 0:03:55.584,0:03:58.689 EditorApplication.isPlaying을 false로 지정합니다. 0:03:58.689,0:04:01.076 이는 씬의 플레이를 중지하게 된다는 의미입니다. 0:04:01.535,0:04:04.020 만약, 에디터를 사용하지 않는다면 0:04:04.020,0:04:06.822 즉, 이것이 게임의 빌드이면 0:04:06.822,0:04:08.822 Application.Quit을 호출하는데, 이것은 0:04:08.822,0:04:11.187 애플리케이션을 종료하고 바탕화면으로 나간다는 의미입니다. 0:04:15.418,0:04:18.397 Unity 에디터에서는 Paused와 0:04:18.397,0:04:20.397 Unpaused 스냅샷이 0:04:20.397,0:04:23.550 Audio Mixer 스냅샷에 할당되어 있습니다. 0:04:23.550,0:04:26.261 여기 Master Mixer에서 생성한 스냅샷이죠. 0:04:26.261,0:04:28.884 이것을 변경하고 싶으면 0:04:28.884,0:04:30.403 Asset Picker를 이용해 그렇게 할 수 있습니다. 0:04:31.749,0:04:34.601 스냅샷 간에 트랜지션이 일어날 때 0:04:34.601,0:04:37.971 기본 보간 커브는 직선입니다. 0:04:38.490,0:04:41.430 이것을 변경하려면 파라미터를 선택하면 되는데, 0:04:41.747,0:04:44.546 파라미터를 오른쪽 버튼 클릭하고 0:04:44.546,0:04:46.546 오버라이드 트랜지션 유형 중에 하나를 선택하세요. 0:04:46.988,0:04:49.907 Smoothstep Snapshot 트랜지션 유형을 선택하면 0:04:50.253,0:04:53.261 S자 트랜지션 커브를 제공하고, 0:04:53.742,0:04:57.420 Squared는 포물선 커브, 0:04:57.824,0:05:00.930 SquareRoot은 제곱근 커브를 제공합니다. 0:05:01.440,0:05:04.806 BrickwallStart는 트랜지션 시작 시에 0:05:04.806,0:05:06.806 보관된 값으로 0:05:06.806,0:05:09.754 즉시 트랜지션하고, 0:05:10.341,0:05:12.661 BrickwallEnd는 트랜지션이 시간이 지날 때까지 0:05:12.661,0:05:15.389 기다렸다가 보관된 값으로 0:05:15.389,0:05:18.960 급격한 트랜지션을 진행합니다. 0:05:19.601,0:05:22.003 TransitionTo를 사용하는 것 외에도 0:05:22.003,0:05:24.773 여러 스냅샷을 0:05:24.773,0:05:27.166 보간한 블렌드로 0:05:27.166,0:05:30.261 트랜지션하는 방법도 있는데, 0:05:30.261,0:05:32.261 이때는 TransitionToSnapshots 함수를 사용합니다. 0:05:32.261,0:05:36.335 TransitionToSnapshots 함수는 세 개의 파라미터를 가집니다. 0:05:36.922,0:05:41.098 첫 번째는 Audio Mixer 스냅샷의 배열을 이용해 0:05:41.098,0:05:44.152 어떤 스냅샷을 가지고 블렌드를 0:05:44.152,0:05:46.499 생성할 것인지 선택할 수 있습니다. 0:05:46.835,0:05:49.639 두 번째 파라미터는 부동소수점형 배열로서, 0:05:49.639,0:05:51.977 결과로 얻은 블렌드에서 각 요소의 가중치(weight)를 0:05:51.977,0:05:55.254 정할 수 있습니다. 0:05:55.254,0:05:57.648 세 번째 파라미터는 초 단위의 부동소수점형 변수인데, 0:05:57.648,0:06:00.498 새로운 블렌드에 도달하는 데 걸리는 0:06:00.498,0:06:04.022 시간을 지정합니다. 0:06:04.022,0:06:06.415 TransitionToSnapshots은 0:06:06.415,0:06:08.415 스냅샷을 포함하는 Audio Mixer, 즉 0:06:08.415,0:06:10.618 지금 트랜지션을 진행하고 있는 믹서에서 호출합니다. 0:06:11.175,0:06:15.602 여기 세 개의 큐브 트리거가 셋업되어 있습니다. 0:06:16.001,0:06:18.884 플레이어가 이들 중 하나와 부딪치면 0:06:18.884,0:06:21.801 두 스냅샷의 블렌드로 0:06:21.801,0:06:23.801 트랜지션할 것입니다. 0:06:24.839,0:06:27.624 각 스냅샷들은 0:06:27.951,0:06:30.887 Sound Effects 서브 믹서에서 설정되었습니다. 0:06:31.993,0:06:34.948 Sound Effects 서브 믹서는 0:06:34.948,0:06:37.191 Master Mixer의 Sound Effects 그룹에서 실행됩니다. 0:06:37.191,0:06:39.461 이 예제에서는 음악을 껐습니다. 0:06:41.326,0:06:44.262 Sound Effects 믹서의 Gunshots 그룹에 0:06:44.262,0:06:46.492 Send 효과를 추가했습니다. 0:06:47.550,0:06:49.550 이 효과는 Add에서 Send를 선택하면 됩니다 0:06:49.550,0:06:51.550 이 효과의 역할은 Gunshots 시그널의 사본을 0:06:51.550,0:06:54.144 Reverb Return에 추가해 놓은 0:06:54.144,0:06:56.144 Receive 효과로 보내는 것입니다. 0:06:56.144,0:06:58.144 Receive 효과는 이 시그널을 0:06:58.144,0:07:01.326 SFX Reverb 효과로 보내고, 그 결과 총성은 마치 0:07:01.326,0:07:04.935 소리가 울리는 공간에서 처럼 들릴 것입니다. 0:07:05.262,0:07:07.512 두 개의 스냅샷을 설정하였습니다. 0:07:08.464,0:07:12.537 하나는 아무 리버브가 없도록(No Reverb) 0:07:12.537,0:07:14.537 총성 Send 효과의 Send 레벨이 0:07:14.537,0:07:16.218 완전히 내려진 경우이고, 0:07:16.633,0:07:18.911 다음은 반향이 크게 걸리도록(Heavy Reverb) 0:07:18.911,0:07:20.911 끝까지 최대로 올린 경우입니다. 0:07:21.507,0:07:23.584 어떻게 들리는지 들어보도록 하죠. 0:07:25.728,0:07:27.053 Edit In Play Mode를 눌러놓고, 0:07:29.084,0:07:30.833 클릭하면 반향이 전혀 들리지 않습니다.(No Reverb) 0:07:31.594,0:07:33.109 Heavy Reverb를 선택합니다. 0:07:35.609,0:07:38.399 이 경우에는 의도적으로 아주 강하고 비현실적인 0:07:38.399,0:07:41.454 리버브를 넣었기 때문에 반향이 확실히 들릴 겁니다. 0:07:41.454,0:07:43.454 이렇게 세 개의 0:07:43.454,0:07:48.658 투명한 큐브 ReverbTrigger 1, 2 그리고 3을 만들어 보았습니다. 0:07:49.017,0:07:51.473 각 Reverb Trigger는 ReverbTrigger 스크립트의 0:07:51.473,0:07:52.630 사본을 가지고 있습니다. 0:07:52.630,0:07:54.630 ReverbTrigger는 아주 간단한 스크립트로 0:07:54.630,0:07:56.630 ReverbCtrl 스크립트를 위한 0:07:56.630,0:07:59.081 public 변수 한 개와 0:07:59.081,0:08:01.196 정수형 변수 triggerNr가 들어 있습니다. 0:08:03.100,0:08:05.100 플레이어가 0:08:05.100,0:08:07.100 이 스크립트가 붙은 트리거와 충돌하면 0:08:07.100,0:08:10.360 ReverbCtrl의 BlendSnapshot 함수를 호출할 것입니다. 0:08:10.360,0:08:14.651 이건 정수 트리거 번호를 가질 테고요. 0:08:15.401,0:08:18.175 Unity에서는 Reverb Ctrl 변수를 0:08:18.175,0:08:21.387 할당해 놓았는데, 0:08:21.387,0:08:23.952 그 스크립트가 연결되어 있는 0:08:24.346,0:08:26.442 AudioMixerControl 오브젝트를 끌어다 놓으면 됩니다. 0:08:26.442,0:08:29.565 또한 고유한 Trigger Nr를 0:08:29.565,0:08:31.729 트리거 오브젝트에 각각 할당했습니다. 0:08:32.334,0:08:35.631 AudioMixerControl 게임 오브젝트는 0:08:35.631,0:08:37.631 ReverbCtrl 스크립트를 가집니다. 0:08:38.006,0:08:40.006 ReverbCtrl 스크립트에 들어가면 0:08:40.006,0:08:43.935 네임스페이스에 using UnityEngine.Audio를 선언해 놓았습니다. 0:08:43.935,0:08:46.243 이렇게 하면 0:08:46.243,0:08:49.968 AudioMixer, AudioMixerSnapshot 클래스 같은 0:08:50.343,0:08:53.253 UnityEngine.Audio의 멤버를 사용할 수 있습니다. 0:08:53.897,0:08:57.369 AudioMixer형 public 변수 0:08:57.369,0:09:00.745 mixer, 그리고 0:09:00.745,0:09:03.042 AudioMixerSnapshot의 배열 0:09:03.042,0:09:05.042 snapshots를 선언해 놓았습니다. 0:09:05.292,0:09:09.230 또한 public 부동소수점형 배열 0:09:09.230,0:09:12.029 weights를 선언했는데, 이것을 사용해 0:09:12.029,0:09:15.858 스냅샷 상태들 사이를 블렌드할 때 0:09:15.858,0:09:20.120 각 스냅샷의 가중치를 지정할 것입니다. 0:09:20.120,0:09:23.655 public 함수 BlendSnapshot이 있는데, 0:09:23.655,0:09:28.134 이것은 정수형 TriggerNr를 파라미터로 가집니다. 0:09:28.134,0:09:30.134 플레이어가 콜라이더와 충돌할 때 0:09:30.134,0:09:33.500 ReverbTrigger 스크립트에서 가지게되는 정수입니다. 0:09:33.500,0:09:35.500 다음으로는 switch 문이 있는데, 0:09:35.500,0:09:37.500 TriggerNr를 가지고 0:09:37.500,0:09:39.326 어느 콜라이더와 충돌하는지 선택합니다. 0:09:39.326,0:09:42.018 case 1, case 2, case 3이 있죠. 0:09:42.018,0:09:44.018 각 케이스에서는 0:09:44.018,0:09:46.941 weights 배열의 가중치를 지정할 겁니다. 0:09:46.941,0:09:48.941 각 스냅샷이 블렌드에 기여하는 0:09:48.941,0:09:51.527 퍼센티지를 정해주는 거죠. 0:09:51.527,0:09:54.958 case 1은 플레이어가 제일 오른쪽의 0:09:54.958,0:09:58.414 빨간색 트리거 콜라이더를 트리거하면 선택됩니다. 0:09:58.414,0:10:01.216 weights 배열의 가중치는 0:10:01.216,0:10:03.216 1.0과 0으로 지정할 것입니다. 0:10:03.216,0:10:07.186 이것은 결과로 얻는 스냅샷 0:10:07.186,0:10:09.186 블렌드가 0:10:09.186,0:10:12.211 mixer.TransitionToSnapshots 함수를 호출하면 0:10:12.211,0:10:16.376 생성되는 블렌드가 0:10:16.376,0:10:18.376 스냅샷 배열의 0에서는 스냅샷 100%, 0:10:18.376,0:10:23.804 스냅샷 배열의 1에서는 스냅샷 0%인 블렌드가 된다는 뜻입니다. 0:10:23.804,0:10:26.613 case 3에서는 그 반대가 됩니다. 0:10:26.613,0:10:29.178 이 경우에는 No Reverb 스냅샷 0%, 0:10:29.178,0:10:32.658 Heavy Reverb 스냅샷 100%가 되겠죠. 0:10:32.658,0:10:34.658 하지만 case 2에서는 0:10:34.658,0:10:37.409 흥미로운 변화가 있고 0:10:37.409,0:10:39.265 스냅샷으로의 트랜지션이 아주 유용해집니다. 0:10:39.265,0:10:42.851 여기에서 세 번째 리버브 상태가 만들어집니다. 0:10:42.851,0:10:44.851 No Reverb 스냅샷의 25%와 0:10:44.851,0:10:49.046 Heavy Reverb 스냅샷의 0:10:49.046,0:10:53.126 75% 블렌드로 트랜지션하는 거죠. 0:10:53.126,0:10:56.409 따라서 0:10:56.409,0:10:59.298 기존의 스냅샷 두 개의 블렌드로 0:10:59.298,0:11:01.739 트랜지션해서 세 번째 리버브 상태를 생성한 겁니다. 0:11:01.739,0:11:04.308 Unity에서 Reverb Ctrl 스크립트의 0:11:04.308,0:11:06.136 변수들을 할당해 놓았습니다. 0:11:06.471,0:11:09.558 Sound Effects Mixer 에셋을 0:11:09.846,0:11:12.382 Mixer 변수 슬롯으로 끌어다 놓았죠. 0:11:12.382,0:11:15.149 또한 스냅샷들도 0:11:15.149,0:11:17.815 리스트에서 클릭하고 선택해서 할당했습니다. 0:11:17.815,0:11:20.995 여기 보면 No Reverb 스냅샷이 있고, 0:11:20.995,0:11:23.707 여기에는 Heavy Reverb 스냅샷이 있습니다. 0:11:23.707,0:11:26.301 또한 Weights 배열의 Size는 0:11:26.301,0:11:28.301 2로 지정했습니다. 0:11:28.301,0:11:30.301 그러면 Snapshots 배열의 Size와 0:11:30.301,0:11:32.301 일치합니다. 따라서 이 요소들의 리스트가 0:11:32.301,0:11:34.301 정렬되겠죠. 0:11:34.301,0:11:36.301 여기서 값을 초기화하지 않은 것은 0:11:36.301,0:11:39.225 런타임에 스크립트에 의해 지정될 것이기 때문입니다. 0:11:39.225,0:11:42.919 이걸 시험해 볼 때는 0:11:42.919,0:11:46.030 Gunshots 트랙의 Reverb Return 레벨과 0:11:46.030,0:11:48.030 캐릭터가 각기 다른 트리거를 통과할 때 0:11:48.030,0:11:50.582 어떻게 달라지는지 주의해서 보도록 하세요. 0:11:50.582,0:11:52.582 그럼 한 번 시험해 보겠습니다. 0:12:10.043,0:12:12.043 여기서 한 일이 뭔가 하면 0:12:12.043,0:12:15.746 두 개의 스냅샷 No Reverb와 Heavy Reverb를 사용해서 0:12:15.746,0:12:18.935 보라색 콜라이더로 보여지는 0:12:18.935,0:12:20.810 이 세 번째 블렌드 스냅샷을 만들어낸 것입니다. 0:12:20.810,0:12:23.662 그리고 여기서는 리버브를 보이도록 선택했지만 0:12:23.662,0:12:25.662 이 기술은 모든 종류의 오디오 상태에 적용할 수 있고, 0:12:25.662,0:12:29.131 스냅샷에 저장할 수 있는 0:12:29.131,0:12:31.700 어떤 유형의 믹서 상태도 0:12:31.700,0:12:34.253 이와 똑같은 방법을 이용해 0:12:34.253,0:12:36.897 블렌드하고 불러올 수 있습니다.