버전

menu_open
Wwise SDK 2023.1.3
통합 상세 내용 - 환경과 Game-defined Auxiliary Send

Wwise의 Game-defined Auxiliary Send(게임에서 정의한 보조 전송)는, 게임 내 사운드의 위치에 따라 하나 이상의 환경 효과를 쉽게 적용할 수 있는 방법입니다. 해당 오브젝트 속성이나 여기서 속성을 상속받은 오브젝트에서 'Use game-defined auxiliary sends (게임에서 정의한 보조 전송 사용)' 옵션이 선택돼있어야 합니다.

사운드 디자이너는 Wwise를 이용해 게임에서 사용할 여러 환경을 정의할 수 있습니다. 예를 들어 환경의 예시로 다음과 같은 것들이 있습니다.

  • hangar (격납고)
  • tunnel (터널)
  • 또는 그 외 게임에서 사용하는 다양한 요소들

각 환경은 다양한 매개 변수를 이용해 환경의 Reverb Effect를 나타냅니다. 그리고 각 환경은 Wwise 프로젝트에서 Auxiliary Bus를 이용해 표현됩니다.

가장 먼저, 각 게임 오브젝트는 어떤 환경으로도 정의돼있지 않은 위치에 있어야 합니다. 사운드가 환경이 아닌 경우 (어떤 Auxiliary Bus로도 라우팅되지 않은 경우) 정상적으로 재생됩니다. 즉, 어떤 환경 Effect도 관여하고 있지 않은 경우입니다.

동일한 Auxiliary Bus 안의 모든 사운드는 Effect가 적용되기 전에 함께 믹스됩니다. 그리고 각 게임 오브젝트에 대해 다양한 음량을 설정할 수 있습니다.

참고: API 범위에서 사용되는 0에서 1 사이 값은 최대 볼륨에 대한 백분율을 나타냅니다. 0은 0이고 1은 100를 뜻합니다. 볼륨을 한 곳 이상에 적용하면 결과 값이 증가합니다. 예를 들어 GAME_OBJECT_ID_HUMAN 게임 오브젝트가 Auxiliary Bus 'Hangar(격납고)'에서 50이고 Auxiliary Bus 'Hangar'는 90로 감쇠되면, 이 게임 오브젝트에서 방사하는 소리는 해당 Effect에 45로 입력됩니다 (0.50f * 0.90).

게임에서 정의한 보조 전송은 다음과 같은 함수로 다룹니다.

Dynamic Auxiliary Bus 라우팅: Auxiliary Bus로 동적 전송하기

Auxiliary Send와 리스너 게임 오브젝트

Wwise 사운드 엔진의 모든 버스 인스턴스는 게임 오브젝트와 관련돼 있습니다. 보조 전송(Aux Send)을 생성할 때, 특정한 보조 버스(Aux Bus)를 대상으로 사운드 엔진에서 리스너-이미터 관계를 생성하게 됩니다. 음원과 대상 오디오 노드에서 이미터와 리스너 게임 오브젝트 위치를 사용해 사운드를 공간화합니다 (사운드가 저작 도구에서 3D로 설정돼있는 경우). 보조 전송을 정의할 때, 이미 음원 오디오 노드의 직접 출력에 할당된 것처럼 대상 보조 버스에 대해 동일한 리스너를 사용해야 할 경우가 종종 있습니다. 즉, SetListeners()SetDefaultListeners() 를 통해 이미 할당된 리스너를 사용해야 하는 경우입니다. 이러한 작업뿐만 아니라 어느 게임 오브젝트가 어느 리스너와 이미 관련돼있는지 기억하지 않아도 되게끔 하기 위해, 간단히 listenerIDAK_INVALID_GAME_OBJECT 를 보내면 됩니다.

참고: AkAuxSendValue 구조체의 listenerID 영역을 입력하는 것을 잊지 마세요. 공란으로 두면 예상치 못한 작동이 일어납니다.

ID 또는 문자열(유니코드 또는 ANSI) 이용하기

SDK에서는, SoundBank 안의 구성 요소에 접근할 때 사용하는 문자열과 ID를 이용한 두 가지 방법을 보여줍니다. 문자열을 이용하는 방법은 코드를 더 읽기 쉽게 만들고, 일반적으로 문자열을 사용하는 작업 환경에 더 적합합니다. ID의 사용은 Wwise가 런타임에서 이름을 해시 할 필요가 없게 해줍니다.

ID 사용 활성화

ID를 이용해 작업하려면 반드시 뱅크를 Wwise의 Generate SoundBanks 대화 상자에서 'Generate header file' 옵션으로 생성해야 합니다. Wwise_IDs.h라는 이름의 정의 파일은 필요한 모든 ID를 포함합니다. 이 파일은 각각의 뱅크가 생성될 때마다 갱신됩니다.

Wwise에서 뱅크 생성과 관련해 더 많은 정보는 Wwise Help를 참고하세요.

ID로 작업하기

경고: ID로 작업할 때는 새로운 뱅크를 생성할 때마다 .h 파일을 최신으로 유지하는 것이 중요합니다. 그렇지 않으면 ID가 맞지 않거나 컴파일 오류가 발생하게 됩니다.

여기 아주 간단한 Wwise로 생성된 헤더 파일에 대한 예제가 있습니다.

코드는 수정하지 말고 그대로 두어야 합니다.

/////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Audiokinetic Wwise가 생성한 include 파일. 수정하면 안 됩니다.
//
/////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef __WWISE_IDS_H__
#define __WWISE_IDS_H__
namespace AK
{
namespace EVENTS
{
enum
{
PLAY_ENGINE = 7,
PLAY_FOOTSTEP = 3,
PLAY_HELLO = 6,
PLAY_MARKERS_TEST = 1007392764,
STOP_ENGINE = 8,
};
} // 네임스페이스 EVENTS
namespace AUX_BUSSES
{
static const AkUniqueID HANGAR_ENV = 2112490296U;
static const AkUniqueID TUNNEL_ENV = 2112490296U;
} // 네임스페이스 AUX_BUSSES
} // 네임스페이스 AK
#endif // __WWISE_IDS_H__

Wwise가 생성한 헤더 파일은 대부분 위에 나와있는 내용보다 훨씬 더 많은 정보를 포함하고 있습니다. 이벤트, State, Switch, 버스 등에 대한 입력값이 추가돼있기 때문입니다.

두 가지 방법을 혼합해서 사용할 수도 있습니다. 예를 들어 문자열로 작업함과 동시에 ID를 이용해 환경에 접근할 수 있습니다.

예제: 문자열 변환 (유니코드 버전)

다음에 나오는 방법은 유니코드 문자열에서 ID로의 런타임 변환을 실행합니다. 이 방법을 이용하면 한 환경당 문자열 테이블을 한 번만 조회해 해당 ID를 사용할 수 있습니다.

AkAuxBusID AK::SoundEngine::GetIDFromString( const wchar_t * in_pszString );

Auxiliary Bus로 동적 전송하기

AK::SoundEngine::SetGameObjectAuxSendValues() 함수를 이용해 보조 버스 라우팅을 동적으로 작동시킬 수 있습니다. 이 함수의 첫 번째 매개 변수는 어떠한 게임 정의 보조 버스 라우팅을 적용할 지에 대한 게임 오브젝트 ID입니다. 두 번째와 세 번째 매개 변수는 AkAuxSendValue 타입의 구조체 배열과 전송할 Auxiliary Bus의 개수를 나타냅니다. 사운드의 'Use game-defined auxiliary sends' 옵션이 활성화돼있지 않은 경우, 이 게임 오브젝트에는 아무 환경도 적용하지 않습니다. 게임 오브젝트가 전송된 각 Auxiliary Bus를 위해서 제어 값은 환경의 적용 백분율을 나타내도록 설정해야 합니다. 컨트롤 값은 0.0f에서 1.0f 사이 값이며, 0은 전송이 전혀 없고 1은 100% 전송을 나타냅니다.

참고: 특정 오브젝트의 보조 전송을 변경할 때, 사운드 엔진이 환경을 보간(interpolate)함으로써 오류를 방지합니다. 따라서 주어진 상황에 따라 예상했던 것 보다 더 많은 Auxiliary Bus와 오브젝트가 연결될 수도 있습니다.

예제: 유니코드 문자열을 이용해 주요 캐릭터의 환경 설정하기

Hangar Aux 버스를 100로 설정합니다.

const AkGameObjectID GAME_OBJECT_ID_HUMAN = 200;
#define NUM_ENVIRONMENT 1
AkAuxSendValue aEnv[NUM_ENVIRONMENT];
aEnv[0].listenerID = AK_INVALID_GAME_OBJECT; // SetListeners/SetDefaultListeners API로 할당된 리스너와 동일한 설정을 사용하세요.
aEnv[0].auxBusID = GetIDFromString( L"Hangar" );
aEnv[0].fControlValue = 1.0f; // 1.0f는 100%를 나타내며, 컨트롤 값 범위는 0에서 1입니다.
AK::SoundEngine::SetGameObjectAuxSendValues( GAME_OBJECT_ID_HUMAN, aEnv, NUM_ENVIRONMENT );

예제: Hangar 75%와 Tunnel 25% 설정으로 유니코드 문자열을 이용해 주요 캐릭터의 환경 설정하기

const AkGameObjectID GAME_OBJECT_ID_HUMAN = 200;
#define NUM_ENVIRONMENT 2
AkAuxSendValue aEnv[NUM_ENVIRONMENT];
aEnv[0].listenerID = AK_INVALID_GAME_OBJECT; // SetListeners/SetDefaultListeners API로 할당된 리스너와 동일한 설정을 사용하세요.
aEnv[0].auxBusID = AK::AUX_BUSSES::HANGAR_ENV;
aEnv[1].auxBusID = AK::AUX_BUSSES::TUNNEL_ENV;
aEnv[0].fControlValue = 0.75f; // 0.75는 75%를 나타내며, 컨트롤 값 범위는 0에서 1입니다.
aEnv[1].fControlValue = 0.25f; // 0.25는 25%를 나타내며, 컨트롤 값 범위는 0에서 1입니다.
AK::SoundEngine::SetGameObjectAuxSendValues( GAME_OBJECT_ID_HUMAN, aEnv, NUM_ENVIRONMENT );

컨트롤 값을 이용하면 사운드를 한 환경에서 다른 환경으로 부드럽게 이동시킬 수 있습니다.

예제: No Aux Send 설정하기.

const AkGameObjectID GAME_OBJECT_ID_HUMAN = 200;
작은 정보: 보조 전송 총합이 반드시 100여야할 필요는 없습니다. 예를 들어 특정 게임 오브젝트에 약간의 환경 효과를 설정하려면 한 환경에 대해 게임 오브젝트를 25로 설정하면 됩니다.
경고: The Wwise sound engine does not limit the number of Auxiliary Busses to be sent to at one time. 다시 말해, 동시에 많은 수의 환경 FX를 처리하도록 요청할 수 있다는 뜻입니다. 일부 환경 FX는 CPU를 많이 소모할 수 있으며, 한 번에 너무 많은 실행을 요청하면 성능 저하를 일으킬 수 있습니다. 따라서, 예컨대 동시에 64개의 사운드를 각각의 환경과 함께 재생하는 것 같은 상황을 만들지 않는 것이 중요합니다.

Example: Assigning an Aux Send to an Alternate Listener Game Object to Simulate an Acoustic Portal

다음에 나올 예제에서는 3D 공간에서의 음향 포털을 시뮬레이션하는 데 사용하는 게임 오브젝트가 등록돼 있습니다. 이 게임 오브젝트는 사운드나 주요 리스너가 들어있지 않은 환경을 나타냅니다. listenerID 영역을 유효한 게임 오브젝트 ID로 설정하면, SetListeners() 와 유사한 방식으로 이미터-리스너 관계를 생성하지만, SetListeners() 가 직접 출력에 적용되는 것과는 다르게 오디오 노드의 보조 출력에 적용됩니다. 오디오를 전송하는 오디오 노드는 저작 도구에서 'Use game-defined auxiliary sends (게임에서 정의한 보조 전송 사용)' 플래그를 설정함으로써 제어할 수 있습니다. listenerID 를 설정하여 listenerID 게임 오브젝트에서 auxBusID 로 지정된 버스 인스턴스를 생성하는 과정을 시각적으로 확인하려면, Wwise 저작 도구의 Advanced Profiler(고급 프로파일러)에 있는 보이스 그래프 탭을 확인하세요.

const AkGameObjectID GAME_OBJECT_ID_HUMAN = 200;
const AkGameObjectID GAME_OBJECT_ID_PORTAL = 201;
#define NUM_ENVIRONMENT 1
AkAuxSendValue aEnv[NUM_ENVIRONMENT];
aEnv[0].listenerID = GAME_OBJECT_ID_PORTAL; // 이 보조 전송에 대한 대상 게임 오브젝트 ID.
aEnv[0].auxBusID = AK::AUX_BUSSES::TUNNEL_ENV_PORTAL; // 이 보조 전송에 대한 대상 보조 버스 ID.
aEnv[0].fControlValue = 1.0f;
AK::SoundEngine::SetGameObjectAuxSendValues( GAME_OBJECT_ID_HUMAN, aEnv, NUM_ENVIRONMENT );

이 예제에서 AK::AUX_BUSSES::TUNNEL_ENV_PORTAL 보조 버스는 Wwise 저작 도구에서 'Enable Positioning'으로 설정돼야 하며 위치 타입을 3D로 설정해 3D 시뮬레이션에서도 사운드를 방사할 수 있도록 합니다.

주요 출력 레벨 (또는 원본 레벨) 설정하기

게임 오브젝트의 Auxiliary Bus를 변경하는 것 외에도, AK::SoundEngine::SetGameObjectOutputBusVolume() 함수를 사용해 여기 해당하는 원본 요소(dry component)를 줄일 수 있습니다. 이 함수는 방해(obstruction)를 시뮬레이션하는 데 사용할 수 있습니다. 각 게임 오브젝트에는 맨 처음 기본적으로 100% (1.0f)로 설정된 원본 레벨(dry level)이 있습니다 (단, 사운드 오브젝트의 속성을 별도로 이와 다르게 지정한 경우는 제외).

예제: 주요 캐릭터 사운드의 주요 출력 레벨을 45%로 설정하기

const AkGameObjectID GAME_OBJECT_ID_HUMAN = 200;
// 연결된 모든 리스터에 대해 주요 캐릭터 소리의 원본 레벨(dry level)을 45%로 설정
작은 정보: 리스너가 리버브만 간신히 들을 수 있을 정도로 멀리서 나는 사운드를 시뮬레이션하려면 원본 레벨을 0로 설정합니다.

Auxiliary Bus 볼륨 설정하기

Auxiliary Bus의 출력에 적용할 볼륨은, 다른 일반적인 버스 볼륨이 사용하는 저작 도구나 State, RTPC 등의 Volume 슬라이더를 사용하면 됩니다.

참고
AkReal32 fControlValue
Definition: AkTypes.h:950
Audiokinetic namespace
Auxiliary bus sends information per game object per given auxiliary bus.
Definition: AkTypes.h:947
AkUInt64 AkGameObjectID
Game object ID
Definition: AkTypes.h:142
#define NULL
Definition: AkTypes.h:46
AkUInt32 AkUniqueID
Unique 32-bit ID
Definition: AkTypes.h:134
AKSOUNDENGINE_API AKRESULT SetGameObjectAuxSendValues(AkGameObjectID in_gameObjectID, AkAuxSendValue *in_aAuxSendValues, AkUInt32 in_uNumSendValues)
AKSOUNDENGINE_API AkUInt32 GetIDFromString(const char *in_pszString)
AKSOUNDENGINE_API AKRESULT SetGameObjectOutputBusVolume(AkGameObjectID in_emitterObjID, AkGameObjectID in_listenerObjID, AkReal32 in_fControlValue)
static const AkGameObjectID AK_INVALID_GAME_OBJECT
Invalid game object (may also mean all game objects)
Definition: AkTypes.h:176
AkGameObjectID listenerID
Game object ID of the listener associated with this send. Use AK_INVALID_GAME_OBJECT as a wildcard to...
Definition: AkTypes.h:948
AkUInt32 AkAuxBusID
Auxilliary bus ID
Definition: AkTypes.h:147
AkAuxBusID auxBusID
Auxiliary bus ID.
Definition: AkTypes.h:949

이 페이지가 도움이 되었나요?

지원이 필요하신가요?

질문이 있으신가요? 문제를 겪고 계신가요? 더 많은 정보가 필요하신가요? 저희에게 문의해주시면 도와드리겠습니다!

지원 페이지를 방문해 주세요

작업하는 프로젝트에 대해 알려주세요. 언제든지 도와드릴 준비가 되어 있습니다.

프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.

Wwise를 시작해 보세요