네이티브 DSP(디지털 시그널 프로세싱) 플러그인을 사용하여 오디오를 처리하고 파라미터를 노출하여 사용자가 오디오 효과를 실험하도록 할 수 있습니다. Unity에서 제공하는 예시 플러그인 에서 플러그인을 실험하고 필요한 파라미터에 대한 아이디어를 얻을 수 있습니다.
Unity용 네이티브 오디오 플러그인을 개발하려면 다음 단계를 따르십시오.
오디오 플러그인 파일을 생성합니다.
플러그인을 인스턴스화합니다.
플러그인을 언로드합니다.
오디오 플러그인 파일을 생성하려면 다음 단계를 따르십시오.
최신 오디오 플러그인 SDK를 다운로드합니다.
폴더에서 NativeAudioPlugins > NativeCode로 이동합니다. 네이티브 예시 플러그인 .cpp 파일이 여기에 있습니다.
플러그인 .cpp 파일 중 하나를 복제하여 자체 플러그인의 템플릿으로 사용하거나, 예시 플러그인 파일(예: Plugin_Equalizer.cpp
)에서 직접 작업하거나, 자체 .cpp 파일을 생성할 수 있습니다.
AudioPluginUtil.h
가 없는 경우 파일에 포함합니다.
사용자가 플러그인을 사용할 때 상호작용하는 데 유용한 파라미터 목록을 만듭니다. 플러그인에 파라미터를 추가하려면 다음 단계를 따르십시오.
플러그인 .cpp 파일에서 파라미터를 열거형 값으로 정의합니다. 예시:
enum Param
{
P_FREQ, //Frequency parameter
P_MIX, //Mix parameter
P_NUM //An extra value to keep track of length of the enum
};
UnityAudioParameterDefinitions
의 배열을 생성하고 크기를 파라미터의 수로 설정합니다.
int numparams = P_NUM;
definition.paramdefs = new UnityAudioParameterDefinition [numparams];
RegisterParameter
함수를 사용하여 각 열거형 값을 등록합니다.
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
함수와 해당 파라미터, 위 코드 예시에서 사용된 방법에 대한 개요가 나와 있습니다.
파라미터 타입 및 이름 | 예시 코드의 변수 | 설명 |
---|---|---|
UnityAudioEffectDefinition definition |
definition |
UnityAudioEffectDefinition 구조는 UnityAudioParameterDefinition의 배열을 포함합니다. RegisterParameter 함수는 파라미터 정의를 이 배열에 엔트리로 삽입합니다. |
char* name |
"Frequency" , "Mix Amount"
|
파라미터에 부여할 표시 이름입니다. |
char* unit |
"Hz" , "%"
|
값의 타입입니다. |
float minval |
0.0f |
파라미터의 최소값입니다. |
float maxval |
kMaxSampleRate , 1.0f
|
파라미터의 최대값입니다. |
float defaultval |
1000.0f , 0.5f
|
파라미터의 기본 및 최초 값입니다. |
float displayscale |
1.0f , 100.0f
|
파라미터 표시 전용 스케일 인자입니다. 예를 들어 예시 코드의 백분율에서는 최소값이 0, 최대값이 1, 스케일 인자가 100.0f입니다. 즉, 실제 값은 0과 1 사이이지만 Unity의 GUI에 표시되는 값은 0%와 100% 사이입니다. |
float displayexponent |
3.0f , 1.0f
|
파라미터를 슬라이더에 매핑합니다. |
int enumvalue |
P_FREQ , P_MIX
|
이 값을 할당할 열거형 값입니다. |
Unity는 이러한 기본 파라미터 정의에서 기본 GUI를 생성합니다.
플러그인 인스턴스를 생성하려면 CreateCallback
함수를 사용합니다. Unity는 플러그인을 생성하는 즉시 CreateCallback
함수를 호출합니다. 이 함수는 null일 수 있습니다.
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
오브젝트는 호스트에서 수신한 데이터를 저장하고 모든 콜백 함수에 데이터를 전달합니다. 저장되는 데이터에는 다음이 포함됩니다.
샘플링 속도
처리된 총 샘플 수(타이밍용)
플러그인의 바이패스 여부
플러그인 인스턴스를 해제하려면 ReleaseCallback
함수를 사용합니다.
Unity는 플러그인을 해제하기 직전에 ReleaseCallback
함수를 호출하고 이 특정 플러그인 인스턴스와 관련된 모든 데이터도 해제합니다. 그 후에는 인스턴스에 관한 추가 콜백이 발생하지 않습니다.
UNITY_AUDIODSP_RESULT UNITY_AUDIODSP_CALLBACK ReleaseCallback(
UnityAudioEffectState* state)
{
EffectData::Data* data = &state->GetEffectData<EffectData>()->data;
delete data;
return UNITY_AUDIODSP_OK;
}
오디오 프로세싱을 처리하려면 ProcessCallback
함수를 사용합니다. Unity는 읽을 입력 오디오 블록과 쓸 출력 블록을 사용하여 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
에 캐스트하는 헬퍼 함수입니다.
Unity에서 플러그인 파라미터를 표시하는 방식을 커스터마이즈하려면 오디오 플러그인용으로 GUI 커스터마이즈를 참조하십시오.
플러그인을 Unity로 임포트하려면 Unity에서 네이티브 DSP 플러그인 및 GUI 사용을 참조하십시오.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.