Version: 2022.2
언어: 한국어
사용 및 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 프로퍼티를 통해 수행됩니다.이 클래스 안에 있는 중요한 함수는 bool OnGUI(IAudioEffectPlugin 플러그인) 함수 뿐입니다.이 함수는 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를 개발하는 동안 모든 파라미터를 사용할 수 있으므로 유용하며, 올바른 작업을 수행하면 예상한 대로 파라미터가 변경되는지 쉽게 확인할 수 있다는 장점도 있습니다.

이퀄라이저 및 멀티밴드 플러그인에서 실행되는 DSP 프로세싱은 Robert Bristow Johnson의 훌륭한 오디오 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 코드로 전달됩니다.데이터를 리샘플링해야 FFTAnalyzer가 고정 주파수 해상도로 분석을 실행하하는 반면 GetFloatBufferCallback은 데이터가 표시되는 뷰의 너비에 따라 결정되는 요청된 샘플 수만 반환합니다.최소한의 DSP 코드만 있는 단순 플러그인의 경우 신호의 스트레오 효과를 나타내기 위해 오른쪽 채널의 진폭을 왼쪽 채널의 진폭과 대조하여 표시하는 CorrelationMeter 플러그인을 사용할 수 있습니다.

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

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

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

컨볼루션 리버브 플러그인의 예. 임펄스 응답은 감쇠되는 임의 노이즈로 파라미터에 따라 정의됩니다. 이 플러그인은 시연 용도로만 제공됩니다. 프로덕션 플러그인으로 사용하려면 사용자가 임의로 녹음된 임펄스를 로드할 수 있어야 합니다. 그러나 근본적인 컨볼루션 알고리즘은 동일합니다.

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

DSP 클럭에 동기화

재미있는 실습을 해보기 위해 플러그인 시스템을 사용하여 사운드를 프로세싱하는 대신 생성해 봅시다.애시드 트랜스 음악을 듣는 사용자를 위한 간단한 베이스라인과 드럼 신시사이저의 경우, 이 장르를 정의한 주요 신시사이저의 간단한 클로닝을 사용해 보십시오.간단한 신시사이저인 Plugin_TeeBee.cppPlugin_TeeDee.cpp는 임의의 음으로 패턴을 생성하고 합성 엔진에서 필터 및 엔벨로프 등을 미세 조정하는 파라미터도 있습니다.노래의 위치를 결정하기 위해 ProcessCallback에서 state->dsptick 파라미터를 읽습니다.이 카운터는 전반적인 샘플 위치이므로 샘플에 지정된 각 음의 길이로 나누고, 나누어 떨어질 때마다 합성 엔진에 이벤트를 발생시킬 수 있습니다.이렇게 모든 플러그인 효과가 동일한 샘플 기반의 클럭으로 싱크됩니다.이러한 효과를 통해 템포가 알려진 미리 녹음된 음악을 재생하면 음악에 템포 동기화된 필터 효과나 딜레이를 적용하는 데 타이밍 정보를 활용할 수 있습니다.

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

공간화

네이티브 오디오 플러그인 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