Version: 2023.1
언어: 한국어
사용 및 API 개요
오디오 스페이셜라이저 SDK

네이티브 오디오 플러그인 SDK

네이티브 오디오 플러그인 SDK는 Unity의 빌트인 네이티브 오디오 플러그인 인터페이스입니다.이 페이지에서는 기본 개념과 복합적인 사용 사례를 안내합니다.

선행 조건

먼저 최신 오디오 플러그인 SDK를 다운로드해야 합니다.

개요

네이티브 오디오 플러그인 시스템은 다음 두 부분으로 구성됩니다.

  • C나 C++로 작성된 .dll(Windows) 또는 dylib(OSX)로 구현되어야 하는 네이티브 DSP(디지털 시그널 프로세싱) 플러그인.스크립트와는 달리 이 플러그인은 플랫폼별 최적화를 통해 지원하려는 모든 플랫폼에서 컴파일할 수 있어야 합니다.

  • C#으로 개발된 GUI.GUI는 선택 사항이므로 항상 기본 네이티브 DSP 플러그인을 생성하여 플러그인 개발을 시작하고, 네이티브 플러그인이 노출하는 파라미터 설명에 대한 기본 슬라이더 기반 UI를 Unity에서 표시하도록 합니다.이는 모든 프로젝트를 시작할 때 권장하는 방식입니다.

다른 에디터 스크립트와 마찬가지로 처음에 C# GUI를 만들 때 에디터의 Assets 폴더에 간단히 저장하는 ‘.cs’ 파일로 프로토타입을 만들 수 있습니다.나중에 코드가 점점 커져서 모듈화와 IDE 지원을 개선해야 할 때 이 파일을 적절한 Visual Studio 프로젝트로 옮길 수 있습니다.그러면 이 파일을 .dll로 컴파일할 수 있으므로 사용자가 이 파일을 프로젝트에 더 쉽게 넣고 코드를 보호할 수도 있습니다.

네이티브 DSP와 GUI DLL은 모두 여러 플러그인을 포함할 수 있고, 바인딩은 DLL파일 이름에 상관없이 플러그인의 효과 이름에 따라서만 수행됩니다.

파일 유형

네이티브 플러그인 SDK는 하나의 파일(AudioPluginInterface.h)로 구성되어 있습니다. 하지만 동일한 .dll 내에 여러 플러그인 효과를 추가하기 위해 Unity는 효과 정의와 파라미터 등록을 통합된 방식으로 처리할 수 있는 추가 코드를 제공합니다(AudioPluginUtil.hAudioPluginUtil.cpp). NativePluginDemo 프로젝트에는 게임 컨텍스트에서 유용한 다양한 플러그인 유형을 표시하며 시작하는 데 도움이 되는 몇 가지 예제 플러그인이 포함되어 있습니다. 이 코드는 공용 도메인에서 사용할 수 있으므로 누구나 자신만의 창작물을 만들기 위한 시작점으로 사용할 수 있습니다.

플러그인 개발

플러그인 개발을 시작하려면 플러그인의 파라미터를 정의합니다. 플러그인에 포함되어야 하는 모든 파라미터에 대한 상세한 계획을 세울 필요는 없지만, 사용자 경험과 참조하려는 다양한 구성 요소에 대한 대략적인 아이디어가 있으면 유용합니다.

Unity에서 제공하는 예시 플러그인에는 쉽게 시작할 수 있는 유틸리티 함수가 패키지로 제공됩니다. 예를 들어 간단한 플러그인인 Ring Modulator 예시 플러그인이 있습니다. 이 플러그인은 수신 신호를 사인파와 곱하여, 특히 주파수가 서로 다른 여러 링 모듈레이션 효과가 체인처럼 연결된 경우 전파 잡음 및 수신 끊김과 유사한 효과를 주게 됩니다.

예시 플러그인에서 파라미터를 처리하는 기본적인 방법은 편리성과 간결성을 위해 사용하는 열거형 값을 실수 배열의 인덱스로 정의하는 것입니다.

enum Param
{
    P_FREQ,
    P_MIX,
    P_NUM
};

int InternalRegisterEffectDefinition(UnityAudioEffectDefinition& definition)
{
    int numparams = P_NUM;
    definition.paramdefs = new UnityAudioParameterDefinition [numparams];
    RegisterParameter(definition, "Frequency", "Hz",
        0.0f, kMaxSampleRate, 1000.0f,
        1.0f, 3.0f,
        P_FREQ);
    RegisterParameter(definition, "Mix amount", "%",
        0.0f, 1.0f, 0.5f,
        100.0f, 1.0f,
        P_MIX);
    return numparams;
}

RegisterParameter 호출의 숫자는 표시에만 사용되는 스케일링 인자가 뒤따르는 최소값, 최대값, 기본값입니다.즉, 백분율 값의 경우 실제 값은 0에서 1까지 증가하지만 표시할 때는 100으로 곱합니다.여기에 사용되는 커스텀 GUI 코드는 없지만 Unity에서는 이러한 기본 파라미터 정의로부터 기본 GUI를 생성합니다.정의되지 않은 파라미터에 대해서는 확인 절차가 수행되지 않으므로 AudioPluginUtil 시스템은 모든 선언된 열거값(P_NUM 제외)이 해당하는 파라미터 정의와 일치할 것이라고 예상합니다.

RegisterParameter 함수는 내부적으로 해당 플러그인과 연관된 UnityAudioEffectDefinition 구조의 UnityAudioParameterDefinition 배열에 있는 항목을 채웁니다(AudioEffectPluginInterface.h 헤더 파일 참조). 또한 UnityAudioEffectDefinition에서 다음과 같은 나머지 항목을 설정합니다.

  • 플러그인 인스턴스화를 처리하는 함수에 대한 콜백(CreateCallback)
  • SetFloatParameterCallback/UnityAudioEffect_GetFloatParameterCallback의 파라미터 설정 및 가져오기
  • UnityAudioEffect_ProcessCallback의 실제 프로세싱
  • 완료되면 UnityAudioEffect_ReleaseCallback에 대한 플러그인 인스턴스를 삭제합니다.

각 플러그인은 동일한 DLL에 여러 플러그인을 쉽게 포함할 수 있도록 자체 네임스페이스에 상주하며, 콜백 함수에 대한 특정 명명 규칙을 사용하여 DEFINE_EFFECTDECLARE_EFFECT 매크로가 UnityAudioEffectDefinition 구조를 채울 수 있게 합니다. 내부적으로는 모든 효과 정의가 배열에 저장되며, 라이브러리의 유일한 엔트리 포인트인 UnityGetAudioEffectDefinitions에서 이 배열에 포인터를 반환합니다.

위 내용은 VST나 AudioUnits 등 다른 포맷의 플러그인에서 Unity 오디오 플러그인 인터페이스로 매핑하는 브릿지 플러그인을 개발하려고 할 때 알아 두면 유용합니다. 이 경우 로드 시간에 파라미터 설명을 설정하는 보다 동적인 방식을 개발해야 합니다.

플러그인 인스턴스화

다음으로 플러그인 인스턴스에 대한 데이터를 설정해야 합니다. 예제 플러그인에서는 데이터가 EffectData 구조에 설정되어 있습니다. 이 할당 작업은 믹서에서 플러그인의 각 인스턴스에 대해 호출되는 해당 CreateCallback에서 수행되어야 합니다. 다음은 모든 채널에 단 하나의 사인파만 곱하는 간단한 예시입니다. 일반적으로 고급 플러그인에서는 입력 채널별로 추가 데이터를 할당해야 합니다.

struct EffectData
{
    struct Data
    {
        float p[P_NUM]; // Parameters
        float s;        // Sine output of oscillator
        float c;        // Cosine output of oscillator
    };
    union
    {
        Data data;
        unsigned char pad[(sizeof(Data) + 15) & ~15];
    };
};
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK CreateCallback(
    UnityAudioEffectState* state)
{
    EffectData* effectdata = new EffectData;
    memset(effectdata, 0, sizeof(EffectData));
    effectdata->data.c = 1.0f;
    state->effectdata = effectdata;
    InitParametersFromDefinitions(
        InternalRegisterEffectDefinition, effectdata->data.p);
    return UNITY_AUDIODSP_OK;
}

UnityAudioEffectState는 샘플링 속도, (시간당) 처리된 전체 샘플 수, 또는 플러그인의 바이패스 여부 등 호스트에서 전송된 다양한 데이터를 포함하고 모든 콜백 함수로 전달됩니다.

플러그인 인스턴스를 해제하려면 해당하는 다음 함수를 사용하십시오.

UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK ReleaseCallback(
    UnityAudioEffectState* state)
{
    EffectData::Data* data = &state->GetEffectData<EffectData>()->data;
    delete data;
    return UNITY_AUDIODSP_OK;
}

오디오 메인 프로세싱은 ProcessCallback에서 수행됩니다.

UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK ProcessCallback(
    UnityAudioEffectState* state,
    float* inbuffer, float* outbuffer,
    unsigned int length,
    int inchannels, int outchannels)
{
    EffectData::Data* data = &state->GetEffectData<EffectData>()->data;

    float w = 2.0f * sinf(kPI * data->p[P_FREQ] / state->samplerate);
    for(unsigned int n = 0; n < length; n++)
    {
        for(int i = 0; i < outchannels; i++)
        {
            outbuffer[n * outchannels + i] =
                inbuffer[n * outchannels + i] *
                (1.0f - data->p[P_MIX] + data->p[P_MIX] * data->s);
        }
        data->s += data->c * w; // cheap way to calculate a sine-wave
        data->c -= data->s * w;
    }

    return UNITY_AUDIODSP_OK;
}

상단의 GetEffectData 함수는 상태 변수의 effectdata 필드를 위에 선언한 구조체의 EffectData::Data에 캐스트하는 헬퍼 함수일 뿐입니다.

그 외에 입력 신호에 가변 주파수의 백색 소음을 더하거나 곱하는 NoiseBox 플러그인이나 신호를 간단히 다운샘플링하거나 양자화하는 Lofinator 플러그인 같은 간단한 플러그인이 있습니다.이러한 플러그인을 모두 조합하거나 게임 기반 애니메이션 파라미터와 함께 사용하면 휴대폰에서 무전기의 무선 수신 불량이나 망가진 스피커에 이르기까지 모든 것을 시뮬레이션할 수 있습니다.

StereoWidener는 스테레오 입력 신호를 가변 지연이 있는 모노 및 사이드 컴포넌트로 분해한 다음 다시 결합하여 인지되는 스테레오 효과를 증가시킵니다.

시작할 때 사용할 수 있는 커스텀 GUI가 없는 여러 가지 간단한 플러그인
시작할 때 사용할 수 있는 커스텀 GUI가 없는 여러 가지 간단한 플러그인

어느 플랫폼에 어떤 플러그인을 로드할지 결정

네이티브 오디오 플러그인은 다른 네이티브 또는 관리되는 플러그인과 동일한 체계를 사용하며, 따라서 플러그인 임포터 인스펙터를 통해 해당 플랫폼과 연결해야 합니다. 하위 폴더 및 플러그인 배치 위치에 대한 자세한 내용은 데스크톱 플랫폼용 플러그인 빌드를 참조하십시오. 플랫폼 연결은 시스템이 스탠드얼론 빌드에서 각 빌드 타겟에 포함할 플러그인을 파악하는 데 필요하며, 64비트 지원이 도입되면서 이를 플랫폼 내에서 지정해야 합니다. macOS 플러그인은 유니버설 바이너리 포맷을 지원하므로 동일한 번들에 32비트 및 64비트 배리언트를 모두 포함할 수 있다는 점에서 유용합니다.

관리되는 코드에서 호출되는 Unity의 네이티브 플러그인은 네이티브 DLL에서 임포트할 함수를 참조하는 [DllImport] 속성을 통해 로드됩니다. 하지만 네이티브 오디오 플러그인은 플러그인의 효과가 필요할 수 있는 믹서 에셋을 생성하기 전에 로드해야 한다는 점에서 다릅니다. 에디터에서는 스탠드얼론 빌드와 달리 플러그인에 종속된 믹서를 다시 로드하고 다시 빌드할 수 있으므로 이 문제가 발생하지 않지만, 믹서 에셋을 생성하기 전에 플러그인을 로드해야 합니다. 이 문제를 해결하려는 경우 플러그인의 DLL 앞에 audioplugin(대소문자 구분 없음)을 붙이면 시스템이 이를 감지하여 시작 시 자동으로 로드되는 플러그인 목록에 추가할 수 있습니다. 플러그인 내부에 있는 정의는 Unity 믹서 내에 표시되는 효과 이름만 정의한다는 점에 주의하십시오. .dll이 어떻게 불리든, audioplugin 문자열로 시작해야 이를 감지할 수 있습니다.

iOS와 같은 플랫폼의 경우 플러그인 코드는 생성된 XCode 프로젝트에서 제작된 Unity 바이너리에 정적으로 연결되어야 하고 거기서 플러그인 렌더링 기기와 마찬가지로 플러그인 등록을 앱의 시작 코드에 명시적으로 추가해야 합니다.

macOS에서는 번들 하나에 플러그인의 32비트와 64비트 버전이 모두 포함될 수 있습니다. 크기를 줄이기 위해 버전을 나눌 수도 있습니다.

커스텀 GUI가 있는 플러그인

이 섹션에서는 이퀄라이제이션 및 멀티밴드 압축 효과와 같은 고급 플러그인 사용 사례에 대해 설명합니다.이러한 플러그인에는 이전 섹션에서 본 단순 플러그인보다 파라미터 수가 훨씬 더 많습니다.또한 고급 플러그인에는 앞서 설명한 단순 슬라이더보다 파라미터를 더 나은 방법으로 시각화할 수 있도록 파라미터 간에 물리적 연결이 필요합니다.이퀄라이저를 예로 들면, 각 밴드에는 마지막 이퀄라이제이션 커브에 영향을 주는 3가지 필터가 있고, 각 필터에는 물리적으로 연결되고 각 필터의 모양을 정의하는 3개의 파라미터인 주파수, Q인자, 게인이 있습니다.결과 커브와 개별 필터 기여도를 보여주는 큰 디스플레이가 있는 이퀄라이저 플러그인을 사용하는 것도 유용합니다.한 번에 하나씩 변경하는 슬라이더 대신에 컨트롤에서 간단한 드래그 조작을 통해 여러 파라미터를 동시에 설정하는 방식으로 플러그인을 작동할 수 있습니다.

이퀄라이저 플러그인의 GUI를 커스터마이즈하려면 세 개의 밴드를 드래그하여 필터 커브의 게인과 주파수를 변경합니다.각 밴드의 모양을 변경하려면 드래그하는 동안 shift 키를 길게 누릅니다.

요약하자면, 정의, 초기화, 초기화 해제, 파라미터 처리는 단순 플러그인이 사용하는 것과 똑같은 열거형 기반 메서드를 따르며, ProcessCallback 코드도 짧은 편입니다.

적절한 플러그인을 사용하려면 다음 단계를 따르십시오. 1. Visual Studio에서 AudioPluginDemoGUI.sln 프로젝트를 엽니다. 2. GUI 코드와 관련된 C# 클래스를 찾습니다.

Unity는 네이티브 플러그인 dll을 로드하고 포함된 오디오 플러그인을 등록한 다음, 등록된 플러그인의 이름과 일치하는 해당 GUI를 찾기 시작합니다. 이는 모든 커스텀 플러그인 GUI와 마찬가지로 IAudioEffectPluginGUI에서 상속해야 하는 EqualizerCustomGUI 클래스의 Name 프로퍼티를 통해 수행됩니다. 이 클래스에서 유일하게 중요한 함수는 부울 OnGUI(IAudioEffectPlugin plugin) 함수입니다. 이 함수는 IAudioEffectPlugin 플러그인 인자를 통해 네이티브 플러그인에 대한 핸들을 가져오며, 네이티브 플러그인이 정의한 파라미터를 읽고 쓰는 데 이를 사용할 수 있습니다.

파라미터를 읽기 위해 네이티브 플러그인은 다음을 호출합니다.

plugin.GetFloatParameter("MasterGain", out masterGain);

파라미터를 찾으면 true를 반환합니다.이를 설정하기 위해 다음을 호출합니다.

plugin.SetFloatParameter("MasterGain", masterGain);

이 경우에도 파라미터가 존재하면 true를 반환하며, 이는 GUI와 네이티브 코드 사이의 가장 중요한 바인딩입니다.

또한 이 함수를 사용해 NAME 파라미터의 최소값, 최대값, 기본값을 쿼리하여 네이티브 및 UI 코드에서 이러한 값의 정의가 중복되지 않도록 할 수 있습니다. plugin.GetFloatParameterInfo("NAME", out minVal, out maxVal, out defVal); OnGUI 함수가 true를 반환하면 인스펙터는 커스텀 GUI 아래에 기본 UI 슬라이더를 표시합니다. 이는 커스텀 GUI를 개발하는 동안 모든 파라미터를 사용할 수 있다는 점에서 GUI 개발에 유용하며, 이에 대한 올바른 작업이 예상되는 파라미터 변경으로 이어지는지 확인할 수 있다는 추가적인 이점이 있습니다.

이퀄라이저 및 멀티밴드 플러그인에서 수행되는 DSP 프로세싱은 로버트 브리스토 존슨의 유용한 오디오 EQ 쿡북에서 가져온 필터입니다. Unity의 내부 API 함수를 사용하여 커브를 나타내고 주파수 반응에 대한 안티앨리어싱 커브를 그릴 수 있습니다.

이퀄라이저와 멀티밴드 플러그인 모두 플러그인의 효과를 시각화하기 위해 입력 및 출력 스펙트럼을 오버레이하는 코드도 제공합니다. GUI 코드는 오디오 프로세싱보다 훨씬 낮은 업데이트 속도(프레임 속도)로 실행되며 오디오 스트림에 액세스할 수 없습니다. 따라서 이 데이터를 읽기 위해 네이티브 코드는 다음과 같은 특수 함수를 제공합니다.

UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK GetFloatParameterCallback(
    UnityAudioEffectState* state,
    int index,
    float* value,
    char *valuestr)
{
    EffectData::Data* data = &state->GetEffectData<EffectData>()->data;
    if(index >= P_NUM)
        return UNITY_AUDIODSP_ERR_UNSUPPORTED;
    if(value != NULL)
        *value = data->p[index];
    if(valuestr != NULL)
        valuestr[0] = 0;
  return UNITY_AUDIODSP_OK;
}

이를 통해 네이티브 플러그인에서 부동 소수점 데이터 배열을 읽을 수 있습니다. 플러그인 시스템은 요청으로 인해 UI나 네이티브 코드의 속도가 느려지지 않는 한 해당 데이터에 신경 쓰지 않습니다. 이퀄라이저 및 멀티밴드 코드의 경우 FFTAnalyzer라는 유틸리티 클래스를 사용하면 플러그인에서 입력 및 출력 데이터를 손쉽게 입력하고 스펙트럼을 다시 가져올 수 있습니다. 그런 다음 이 스펙트럼 데이터는 GetFloatBufferCallback에 의해 리샘플링되어 C# UI 코드로 전달됩니다. GetFloatBufferCallback이 데이터가 표시되는 뷰의 너비에 의해 정해지는 요청된 샘플 수만 반환하는 반면, FFTAnalyzer는 고정 주파수 해상도에서 분석을 실행하기 때문에 데이터를 리샘플링해야 합니다. 최소 DSP 코드가 있는 단순 플러그인의 경우, 신호의 스테레오 효과를 나타내기 위해 왼쪽 채널의 진폭을 오른쪽 채널의 진폭과 대조하여 표시하는 CorrelationMeter 플러그인도 사용할 수 있습니다.

왼쪽: CorrelationMeter 플러그인의 커스텀 GUI.

오른쪽: 오버레이된 스펙트럼 분석 이퀄라이저 GUI(초록색 커브는 소스, 빨간색 곡선은 처리된 것임)

이퀄라이저와 멀티밴드 효과가 모두 의도적으로 단순하고 최적화되지 않은 상태로 유지되지만 플러그인 시스템이 지원하는 더 복잡한 UI의 좋은 예이기도 하다는 점을 강조하고자 합니다. 여전히 관련 플랫폼별 최적화를 수행하고, 가장 완성도를 높일 수 있는 방식으로 반응하도록 무수한 파라미터를 조정하는 일 등에는 해결할 과제가 많이 있습니다. 단순히 Unity의 표준 플러그인 목록을 늘리기 편하도록 언젠가 이와 같은 효과를 Unity 빌트인 플러그인으로 구현할 수도 있지만, 사용자도 정말 뛰어난 플러그인을 만드는 도전을 해볼 수 있습니다. 그리고 그 플러그인이 언젠가 빌트인 플러그인이 될 수도 있습니다. ;-)

컨볼루션 리버브 플러그인의 예. 임펄스 응답은 감쇠되는 임의 노이즈로 파라미터에 의해 정의됩니다. 프로덕션 플러그인에서는 사용자가 임의로 기록한 임펄스를 로드할 수 있어야 하지만, 기본 컨볼루션 알고리즘은 동일하게 유지되므로 이는 데모용일 뿐입니다.

3개의 서로 다른 타임 스케일에서 레벨을 측정하는 소리 크기 모니터링 툴의 예. 마찬가지로 시연용이지만 최신 소리 크기 표준화를 준수하는 모니터링 툴을 빌드하기 시작하는 데 유용합니다. 커브 렌더링 코드는 Unity에 내장되어 있습니다.

DSP 클럭에 동기화

연습을 해 보고 싶다면 플러그인 시스템을 사용하여 사운드를 처리하는 대신 생성해 보십시오. 애시드 트랜스를 듣는 사용자를 위한 간단한 베이스라인과 드럼 신디사이저의 경우, 이 장르를 정의한 주요 신디사이저의 간단한 클론을 생성해 보십시오. Plugin_TeeBee.cppPlugin_TeeDee.cpp는 임의의 음으로 패턴을 생성하는 간단한 신디사이저로, 합성 엔진에서 필터와 엔벨로프를 미세 조정하는 파라미터가 있습니다. state->dsptick 파라미터는 곡에서의 위치를 결정하기 위해 ProcessCallback에서 읽습니다. 이 카운터는 글로벌 샘플 위치이므로 이를 샘플에 지정된 각 음의 길이로 나누고 이 나눗셈의 나머지가 0이 될 때마다 합성 엔진에 대해 음표 이벤트를 실행할 수 있습니다. 이렇게 하면 모든 플러그인 효과가 동일한 샘플 기반의 클럭에 동기화됩니다. 이러한 효과를 통해 알려진 템포에 사전 녹음된 음악을 재생하려면 타이밍 정보를 사용하여 음악에 템포 동기화 필터 효과 또는 딜레이를 적용할 수 있습니다.

템포 동기화된 효과를 시연하는 간단한 베이스라인 및 드럼 신시사이저
템포 동기화된 효과를 시연하는 간단한 베이스라인 및 드럼 신시사이저

공간화

네이티브 오디오 플러그인 SDK는 공간화 SDK의 기초로, 오디오 소스에 따라 인스턴스화할 커스텀 공간화 효과를 개발하는 데 사용할 수 있습니다. 자세한 내용은 오디오 스페이셜라이저 SDK를 참조하십시오.

전망

네이티브 오디오 플러그인 SDK는 고성능 네이티브 코드에 사운드 시스템 일부를 개발하기 위한 첫걸음에 불과합니다.추후 계획은 다음과 같습니다.

  • 네이티브 오디오를 Unity의 다른 부분에 통합하여 믹서 외에 다른 곳에서 효과를 활용
  • 더 나은 기본 GUI와 바이너리 데이터의 스토리지를 지원하여 다른 파라미터 유형을 지원하기 위해 SDK를 확대

** 면책 조항:**

디자인에는 많은 유사점이 있지만, Unity의 네이티브 오디오 SDK는 Steinberg VST나 Apple AudioUnits 등 다른 플러그인 SDK를 바탕으로 빌드되지 않았습니다. 이 SDK를 사용하여 이런 플러그인을 Unity에서 사용할 수 있도록 기본 래퍼를 쉽게 구현할 수는 있지만, 이는 Unity 개발팀에서 엄격하게 관리하지 않습니다.
플러그인 호스팅에는 고유한 어려움이 있습니다. 예상되는 모든 호출 순서의 복잡성에 대처하고 네이티브 코드를 기반으로 하는 커스텀 GUI 창을 다루는 일은 빠르게 관리가 어려워지기 때문에 예제 코드로서의 유용성이 떨어집니다.

사운드 디자인을 목업으로 만들거나 테스트하기 위해 VST 또는 AU 플러그인이나 효과를 로드하면 꽤 유용할 수 있지만, VST/AU를 사용하면 몇 개의 특정 플랫폼으로만 제한됩니다. Unity SDK를 기반으로 오디오 플러그인을 작성하면 소프트웨어 믹싱과 동적으로 로드되는 네이티브 코드를 지원하는 모든 플랫폼으로 확장할 수 있습니다. 따라서 커스텀 플러그인을 개발하는 데 (또는 단순히 어떤 식으로도 사운드를 수정하지 않는 에디터에서 미터링 플러그인을 사용할 수 있도록 하는 데) 시간을 할애하기 전, 선호하는 툴로 초기 사운드 디자인을 목업으로 만드는 데 유용한 솔루션을 원하는 경우에만 이 접근 방식을 사용하십시오.


사용 및 API 개요
오디오 스페이셜라이저 SDK