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