Wwise 버전
Wwise SDK 2021.1.6
Defining 사용자 지정 속성 정의하기

사용자 지정 속성을 이용하면 Wwise 오브젝트에 추가적인 정보를 입력할 수 있습니다. 사용자 지정 속성은 프로젝트 관리나 게임에서 사용하는 메타 데이터를 저장하는 데 쓰입니다.

사용자 지정 속성은 다음과 같은 곳에서 편집할 수 있습니다.

Wwise Authoring 사용자 인터페이스에서 Project > Project Settings > Custom Properties 메뉴를 이용하면 커스텀 속성을 직접 정의할 수 있습니다.
사용자 인터페이스를 이용하면 제한된 기능 세트에 접근할 수 있다는 점을 기억하세요. 이 커스텀 속성은 프로젝트 폴더 안에 있는 PROJECTNAME.wcustomproperties 파일에 저장됩니다 (PROJECTNAME은 WPROJ 파일과 동일한 이름임). 이 파일을 직접 수정하지 마세요.

완전한 기능 세트를 활성화하려면 다음 위치 중 한 XML 파일에서 커스텀 속성을 수동으로 정의하세요.

  • 'Add-ons\Properties' 폴더 아래 프로젝트 폴더에 들어있는 하나 또는 여러 개의 .wcustomproperties 파일
  • 'APPDATA%\Audiokinetic\Wwise\Add-ons\Properties' 폴더에 들어있는 하나 또는 여러 개의 .wcustomproperties 파일
  • 주요 Wwise 설치 폴더 아래 'Authoring\Data\Add-ons\Properties' 폴더에 들어있는 하나 또는 여러 개의 .wcustomproperties 파일
참고: .wcustomproperties 파일이 수정될 때마다 Wwise Project를 다시 로딩해야 속성이 업데이트됩니다. 커스텀 속성의 이름을 변경할 때 프로젝트의 내용이 자동으로 마이그레이션되지 않는다는 점에 유의하세요.
참고: 이름끼리 충돌할 경우, 맨 처음 로딩된 속성만 등록됩니다. 위에 지정된 순서대로 해당 속성이 로딩됩니다.
참고: 모든 커스텀 속성은 정의된 곳으로부터 독립적으로 프로젝트 로딩 시간에 로드됩니다.

오디오 오브젝트 타입의 커스텀 속성은 AK::SoundEngine::Query::GetCustomPropertyValue 를 이용해 게임 안에서 가져올 수 있습니다. 이 커스텀 속성은 각자 32 비트 데이터로 SoundBank에 내보내지며 32 비트 정수(AkInt32)나 32 비트 부동 소수(AkReal32)로 쿼리할 수 있습니다. bool이나 int16, Real64 같이 다른 타입은 XML에서 지정할 수 있으며 Wwise Authoring 애플리케이션에서 기본적으로 지원됩니다. 그러나 SoundBank 생성 시 지원 타입이 32 비트로 캐스팅됩니다. 문자열과 같이 숫자가 아닌 타입들은 SoundBank로 내보내지 않습니다.

참고: 대사 Event 오브젝트 또한 게임에서 쿼리할 수 있는 커스텀 속성을 지원하며, AK::SoundEngine::DynamicDialogue::GetDialogueEventCustomPropertyValue 를 참조합니다.

XML 파일의 콘텐츠

XML 설명 파일에는 다양한 오브젝트 타입에 추가될 수 있는 커스텀 속성에 대한 정보가 들어있습니다.

  • 다음을 포함한 속성 설명:
    • 속성 이름 (코드와 유지된 파일의 속성을 식별하는 데 사용되는 문자열)
    • 속성 타입
    • RTPC 지원
    • 기본 값
    • 사운드 엔진 속성 ID (사운드 엔진 플러그인에서 이 속성을 코드에 바인딩)
    • 범위 제한 또는 열거 제한
    • 다른 속성에 대한 종속성
    • 사용자 인터페이스 설명 요소

예제: wcustomproperties 파일

아래는 사운드 오브젝트의 추가 속성을 정의하는 간단한 커스텀 속성 XML 설명 파일의 예제입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (C) Audiokinetic Inc. -->
<PluginModule>
<WwiseObject Name="Sound" CompanyID="1" PluginID="1">
<Properties>
<Property Name="MyCompany:Status" Type="int16" DisplayName="Status">
<DefaultValue>0</DefaultValue>
<Restrictions>
<ValueRestriction>
<Enumeration Type="int16">
<Value DisplayName="To do">0</Value>
<Value DisplayName="Done">1</Value>
<Value DisplayName="Verified">2</Value>
</Enumeration>
</ValueRestriction>
</Restrictions>
</Property>
<Property Name="MyCompany:IsReady" Type="bool" DisplayName="Is Ready">
<DefaultValue>false</DefaultValue>
<AudioEnginePropertyID>2</AudioEnginePropertyID>
</Property>
<Property Name="MyCompany:MyPriority" Type="int32" DisplayName="My Priority">
<DefaultValue>50</DefaultValue>
<AudioEnginePropertyID>6</AudioEnginePropertyID>
<Restrictions>
<ValueRestriction>
<Range Type="int32">
<Min>1</Min>
<Max>100</Max>
</Range>
</ValueRestriction>
</Restrictions>
</Property>
<Property Name="MyCompany:CoolDownDelay" Type="Real64" DisplayName="Cool Down Delay">
<UserInterface UIMax="10" Step="0.5" Fine="0.1" Decimals="3" />
<DefaultValue>0</DefaultValue>
<AudioEnginePropertyID>7</AudioEnginePropertyID>
<Restrictions>
<ValueRestriction>
<Range Type="Real64">
<Min>0</Min>
<Max>600</Max>
</Range>
</ValueRestriction>
</Restrictions>
</Property>
<Property Name="MyCompany:GameId" Type="string" DisplayName="Game Id">
<DefaultValue></DefaultValue>
</Property>
<Property Name="MyCompany:ReadOnlyData" DocId="MyCustomProperty" DisplayName="ReadOnlyData" Type="int32">
<UserInterface ControlClass="ReadOnlyText" />
<DefaultValue>10</DefaultValue>
<Restrictions>
<ValueRestriction>
<Range Type="int32">
<Min>0</Min>
<Max>100</Max>
</Range>
</ValueRestriction>
</Restrictions>
</Property>
<Reference Name="MyCompany:StateGroup" DisplayName="State Group">
<AudioEnginePropertyID>10</AudioEnginePropertyID>
<Restrictions>
<TypeEnumerationRestriction>
<Type Name="StateGroup" />
</TypeEnumerationRestriction>
</Restrictions>
</Reference>
</Properties>
</WwiseObject>
</PluginModule>

XML 설명 파일 헤더

이 XML 파일의 헤더 부분을 살펴보고 자세한 내용을 알아봅시다.

<?xml version="1.0" encoding="UTF-8"?>

어떤 XML 파일이든 첫 번째 라인에서는 XML 버전과 인코딩을 정의합니다. 여기서는, XML 버전은 1.0이고 인코딩은 UTF-8 입니다. 모든 Wwise 플러그인 설명 파일의 첫 번째 라인은 항상 위의 것과 같은 양식이어야 합니다.

PluginModule 구성 요소

<PluginModule>
...
</PluginModule>

이 문서의 주요 XML 요소는 PluginModule 라고 이름 붙였으며, 파일 안에 정의된 다양한 오브젝트 타입의 모든 정보를 담고 있습니다.

WwiseObject 구성 요소

<WwiseObject Name="Sound" CompanyID="1" PluginID="1">
<Properties>
...
</Properties>
</WwiseObject>

각 WwiseObject 요소는 해당 오브젝트 타입의 커스텀 속성을 정의합니다. Wwise 내에서 나타나지 않는 속성들을 제외하고 Name 및 CompanyID, PluginID는 Wwise가 알고 있는 것이어야 합니다. 사용 가능한 WwiseObject 구성 요소 목록을 보시려면 Wwise Object ID 를 참고하세요.

속성

모든 사용자 지정 속성에는 접두어가 있어야 합니다. 이는 Audiokinetic 내장 속성과 서드 파티 속성 및 자신의 커스텀 속성과 이름이 충돌하는 것을 방지하는 데 매우 중요합니다.

사용자 인터페이스에서 생성된 속성은 (Project > Project Settings > Custom Properties) 이름에 'Custom:'이라는 접두어가 붙어있습니다. 커스텀 속성을 .wcustomproperties 파일에서 직접 정의할 때에는 'Custom:' 접두어를 사용하지 마세요. 자신의 고유한 접두어를 사용하세요. WPROJECTNAME.wcustomproperties 안에 있는 속성만 'Custom:' 접두어를 사용할 수 있습니다.

회사와 제품 이름을 속성 이름의 접두어로 사용할 것을 강력히 권장합니다. 예시:

<Property Name="MyCompanyMyProduct:MyProperty" Type="string" DisplayName="Game Id">
<DefaultValue></DefaultValue>
</Property>

속성과 레퍼런스에 대한 더 자세한 정보는 플러그인 속성 및 커스텀 속성 XML 설명 을(를) 참고하세요.

Wwise Object ID

참고: 사운드(Music Track과 Container 포함)로부터 파생된 오브젝트만 커스텀 속성 값을 구하는 데 사용할 수 있습니다.

다음은 Wwise Authoring 애플리케이션 내 커스텀 속성을 정의하는 데 사용할 수 있는 모든 WwiseObject 타입입니다.

<WwiseObject Name="AcousticTexture" CompanyID="1" PluginID="72"></WwiseObject>
<WwiseObject Name="Action" CompanyID="1" PluginID="5"></WwiseObject>
<WwiseObject Name="ActorMixer" CompanyID="1" PluginID="8"></WwiseObject>
<WwiseObject Name="Attenuation" CompanyID="1" PluginID="41"></WwiseObject>
<WwiseObject Name="AudioDevice" CompanyID="1" PluginID="71"></WwiseObject>
<WwiseObject Name="AudioSource" CompanyID="1" PluginID="0"></WwiseObject>
<WwiseObject Name="AuxBus" CompanyID="1" PluginID="61"></WwiseObject>
<WwiseObject Name="BlendContainer" CompanyID="1" PluginID="29"></WwiseObject>
<WwiseObject Name="BlendTrack" CompanyID="1" PluginID="30"></WwiseObject>
<WwiseObject Name="Bus" CompanyID="1" PluginID="21"></WwiseObject>
<WwiseObject Name="ControlSurfaceBinding" CompanyID="1" PluginID="67"></WwiseObject>
<WwiseObject Name="ControlSurfaceBindingGroup" CompanyID="1" PluginID="68"></WwiseObject>
<WwiseObject Name="ControlSurfaceSession" CompanyID="1" PluginID="66"></WwiseObject>
<WwiseObject Name="Conversion" CompanyID="1" PluginID="55"></WwiseObject>
<WwiseObject Name="DialogueEvent" CompanyID="1" PluginID="46"></WwiseObject>
<WwiseObject Name="Effect" CompanyID="1" PluginID="17"></WwiseObject>
<WwiseObject Name="Event" CompanyID="1" PluginID="4"></WwiseObject>
<WwiseObject Name="ExternalSource" CompanyID="1" PluginID="57"></WwiseObject>
<WwiseObject Name="Folder" CompanyID="1" PluginID="2"></WwiseObject>
<WwiseObject Name="GameParameter" CompanyID="1" PluginID="23"></WwiseObject>
<WwiseObject Name="Language" CompanyID="1" PluginID="75"></WwiseObject>
<WwiseObject Name="MixingSession" CompanyID="1" PluginID="53"></WwiseObject>
<WwiseObject Name="Modifier" CompanyID="1" PluginID="15"></WwiseObject>
<WwiseObject Name="ModulatorEnvelope" CompanyID="1" PluginID="65"></WwiseObject>
<WwiseObject Name="ModulatorLfo" CompanyID="1" PluginID="64"></WwiseObject>
<WwiseObject Name="ModulatorTime" CompanyID="1" PluginID="78"></WwiseObject>
<WwiseObject Name="MultiSwitchEntry" CompanyID="1" PluginID="10000"></WwiseObject>
<WwiseObject Name="MusicClip" CompanyID="1" PluginID="60"></WwiseObject>
<WwiseObject Name="MusicClipMidi" CompanyID="1" PluginID="62"></WwiseObject>
<WwiseObject Name="MusicCue" CompanyID="1" PluginID="59"></WwiseObject>
<WwiseObject Name="MusicPlaylistContainer" CompanyID="1" PluginID="34"></WwiseObject>
<WwiseObject Name="MusicPlaylistItem" CompanyID="1" PluginID="36"></WwiseObject>
<WwiseObject Name="MusicSegment" CompanyID="1" PluginID="27"></WwiseObject>
<WwiseObject Name="MusicStinger" CompanyID="1" PluginID="38"></WwiseObject>
<WwiseObject Name="MusicSwitchContainer" CompanyID="1" PluginID="35"></WwiseObject>
<WwiseObject Name="MusicTrack" CompanyID="1" PluginID="28"></WwiseObject>
<WwiseObject Name="MusicTrackSequence" CompanyID="1" PluginID="58"></WwiseObject>
<WwiseObject Name="MusicTransition" CompanyID="1" PluginID="37"></WwiseObject>
<WwiseObject Name="Panner" CompanyID="1" PluginID="42"></WwiseObject>
<WwiseObject Name="Path" CompanyID="1" PluginID="11"></WwiseObject>
<WwiseObject Name="Platform" CompanyID="1" PluginID="69"></WwiseObject>
<WwiseObject Name="Position" CompanyID="1" PluginID="12"></WwiseObject>
<WwiseObject Name="Project" CompanyID="1" PluginID="3"></WwiseObject>
<WwiseObject Name="Query" CompanyID="1" PluginID="32"></WwiseObject>
<WwiseObject Name="RandomSequenceContainer" CompanyID="1" PluginID="9"></WwiseObject>
<WwiseObject Name="SearchCriteria" CompanyID="1" PluginID="33"></WwiseObject>
<WwiseObject Name="Sound" CompanyID="1" PluginID="1"></WwiseObject>
<WwiseObject Name="SoundBank" CompanyID="1" PluginID="18"></WwiseObject>
<WwiseObject Name="SoundcasterSession" CompanyID="1" PluginID="26"></WwiseObject>
<WwiseObject Name="State" CompanyID="1" PluginID="6"></WwiseObject>
<WwiseObject Name="StateGroup" CompanyID="1" PluginID="7"></WwiseObject>
<WwiseObject Name="Switch" CompanyID="1" PluginID="20"></WwiseObject>
<WwiseObject Name="SwitchContainer" CompanyID="1" PluginID="10"></WwiseObject>
<WwiseObject Name="SwitchGroup" CompanyID="1" PluginID="19"></WwiseObject>
<WwiseObject Name="Trigger" CompanyID="1" PluginID="40"></WwiseObject>
<WwiseObject Name="UserProjectSettings" CompanyID="1" PluginID="51"></WwiseObject>
<WwiseObject Name="WorkUnit" CompanyID="1" PluginID="25"></WwiseObject>
AkForceInline void Max(AkReal32 *in_pVolumesDst, const AkReal32 *in_pVolumesSrc, AkUInt32 in_uNumChannels)
Get max for all elements of two volume vectors, independently.
AkForceInline void Min(AkReal32 *in_pVolumesDst, const AkReal32 *in_pVolumesSrc, AkUInt32 in_uNumChannels)
Get min for all elements of two volume vectors, independently.