요약: 이 페이지에서는 게임에서 오디오에 맞춰 동기화할 수 있는 훌륭한 도구인 MMAudioAnalyzer에 대해 알아봅니다.
테이블 내용
|
MMAudioAnalyzer란 무엇인가요?
게임의 사운드트랙에 움직임, 크기, 이벤트 등을 동기화하고 싶다면 MMAudioAnalyzer가 흥미로울 것입니다. 이 컴포넌트는 씬의 오브젝트에 추가할 수 있으며, 오디오 소스, 씬 전체의 사운드트랙, 또는 마이크에 바인딩할 수 있습니다. 이 컴포넌트는 소리를 분석하고 해당 데이터를 사용할 수 있는 훅을 제공합니다. 위 비디오에서 작동하는 모습을 볼 수 있으며, 완전히 커스터마이즈 가능한 시각화 도구도 함께 제공됩니다.
인스펙터에서 오디오 소스(AudioSource, Global, 또는 Microphone)를 정의하고, 샘플링 간격, 샘플, 윈도우를 설정할 수 있습니다. (간격이 짧을수록 비용이 많이 들고, 샘플이 많을수록 비용이 많이 듭니다.) 특정한 요구가 없다면, 이 세 가지는 기본값으로 두는 것이 좋습니다. 그런 다음 스펙트럼을 몇 개의 밴드로 나눌지 정의할 수 있습니다. 각 밴드는 개별적으로 분석할 수 있습니다. 밴드가 많을수록 특정 정보를 분리하기 쉬워지지만, 비용이 많이 듭니다. 대부분의 목적을 위해서는 1에서 8 사이면 충분합니다.
정규화된 값 계산
런타임 동안 사운드가 재생되고 있다면, 이러한 밴드의 원시 시각화와 정규화된 버전을 볼 수 있습니다. 오디오 소스에서 정규화된 값을 사용하려면, 시스템이 런타임에 전체 소스를 파싱해야 하므로 약간의 과정이 필요합니다. 재생 버튼을 누르고 사운드가 재생될 때 인스펙터 하단의 Find Peaks 버튼을 누릅니다. 트랙이 고속으로 재생됩니다. 완료되면 재생 모드를 종료하고 Paste Peaks 버튼을 누릅니다. 이제 정규화된 값을 사용할 수 있습니다.
레벨
- Amplitude: 특정 프레임에서 소리의 현재 레벨(기본적으로 볼륨)을 나타냅니다.
- Normalized: 같은 레벨이지만 0에서 1 사이로 정규화된 값입니다. 0은 소리가 전혀 없는 상태, 1은 전체 지속 시간 동안 소리의 최대 진폭을 의미합니다.
- Buffered Amplitude: 소리의 현재 레벨로 이동하는 보간된 값입니다. 실제 값보다 느리게 움직이며, 무언가를 여기에 바인딩할 때 더 부드러운 움직임을 제공합니다. Buffered 값의 이동 속도는 Buffer Speed 설정에 의해 정의됩니다.
- Normalized Buffered Amplitude: 정규화된 값이지만, 위와 같이 버퍼링된 값입니다.
이 4가지 값을 글로벌 사운드와 각 밴드에 대해 확인할 수 있습니다.
비트
배경에서 노래가 재생될 때, 드럼 크래시 심벌이 연주될 때마다 플래시를 트리거하고 싶다고 가정해봅시다(이는 Brass 데모 씬의 사용 사례입니다). 드럼의 각 요소에 대해 별도의 트랙이 재생된다면 비교적 쉽습니다. 하지만 전체 트랙에 대해 단일 .wav 파일을 사용하는 경우는 좀 더 까다롭습니다. 크래시 심벌이 연주되는 시간을 하드코딩할 수도 있지만, 트랙을 변경하면 어떻게 될까요? 이때 Beats가 유용합니다.
MMAudioAnalyzer는 Beats 배열을 정의할 수 있게 해줍니다. 각 Beat는 이름과 색상(순전히 조직 목적)을 가지며, 모드(위의 것들 외에도 원시 값)가 있습니다. 그런 다음 임계값을 정의해야 합니다. 이는 Beat를 트리거하는 가장 중요한 값입니다. 위의 사용 사례에서, 인스펙터에서 8개의 밴드 시각화를 보고 원하는 소리가 재생될 때마다 발생하는 패턴을 찾을 수 있습니다. Brass 데모의 경우, Band#2가 크래시 심벌이 재생될 때마다 상당히 높아지는 것을 볼 수 있습니다. 따라서 Band ID를 2로 설정하고, 밴드 값이 이를 초과할 때마다 이벤트가 발생하도록 임계값을 조정할 수 있습니다. 약간의 시행착오를 통해 이를 조정할 수 있습니다. Beats 시각화는 값이 발생하는 방법과 시점을 보여줍니다. 이 Beats는 이벤트를 트리거하는 데 사용할 수 있으며(값이 임계값을 초과할 때, 상승 시), 개별 플로트로도 볼 수 있습니다(이것이 Beats 시각화가 반영하는 것입니다). 이러한 값을 재매핑하도록 선택하고, 안전 조치로 비트 사이의 최소 시간을 정의할 수 있습니다.
각 비트에 대해 인스펙터에서 Unity Events를 바인딩할 수 있습니다. 이는 특정 소리가 재생될 때마다 피드백을 트리거하는 좋은 방법이 될 수 있습니다.
이 값들을 사용하는 방법
MMAudioAnalyzer 값은 여러 가지 방법으로 액세스할 수 있습니다. 가장 일반적인 방법은 스크립트를 사용하는 것입니다. MMAudioAnalyzer에 대한 참조를 사용하여 다음과 같은 작업을 할 수 있습니다:
TargetLight.intensity = TargetAnalyzer.NormalizedBufferedAmplitude * 5f;
이는 사운드트랙의 현재 진폭에 맞춰 조명의 강도를 설정합니다. Brass 데모의 FeelBrass 컴포넌트에서 동일한 라인을 확인할 수 있습니다. MMAudioAnalyzer의 모든 값도 동일한 방식으로 액세스할 수 있습니다. 예를 들어:
TargetAnalyzer.Beats[0].CurrentValue
이것은 선언한 첫 번째 비트의 현재 값을 제공합니다. 마찬가지로 각 밴드와 비트에 대한 버퍼링된 앰플리튜드, 일반 앰플리튜드 및 모든 다른 값에 접근할 수 있습니다.
Feel의 다른 클래스들도 때때로 MMAudioAnalyzer에 대한 내장 훅을 가집니다. 예를 들어, Float Controller와 Shader Controller는 MMAudioAnalyzer 모드를 가지며, 이를 통해 어떤 밴드나 비트를 청취하여 값을 조정할지 정의할 수 있습니다. Brass 데모 씬의 VisualizerBlocks에서는 이러한 방식으로 사용된 Float Controller의 예를 찾을 수 있습니다. ShaderController는 동일한 씬의 RightBlock에서 사용됩니다. 또한 MMRadio 시스템을 MMAudioAnalyzer와 함께 사용할 수도 있습니다. 이는 Brass 데모에서 GroundBlocks가 단일 발신기와 각 블록에 수신기를 사용하여 움직이는 방식입니다. 마지막으로, MMAudioAnalyzer의 인스펙터 자체에서 각 비트에 직접 이벤트를 바인딩하는 옵션도 항상 있습니다.
이 모든 것들은 소리를 읽고 게임을 소리와 동기화하는 다양한 방법을 제공합니다.
'유니티 에셋 > Feel' 카테고리의 다른 글
MMRadio (1) | 2024.07.14 |
---|---|
MMSequencer (2) | 2024.07.14 |
MMSoundManager (0) | 2024.07.14 |
MMTools (0) | 2024.07.13 |
Tweens and events (0) | 2024.07.13 |