버전

menu_open
Wwise SDK 2024.1.0
SoundBank 통합 예제

다음 섹션에는 다양한 SoundBank 관리 전략의 예제 통합이 포함되어 있습니다. 이러한 전략은 Wwise 도움말의 SoundBanks 관리 전략에 설명되어 있습니다.

참고: PrepareEvent는 메모리 내 데이터를 사용하여 LoadBank와 호환되지 않습니다.


한 개의 일체형 SoundBank

이 전략을 사용하면 모든 이벤트 콘텐츠, 사운드 구조 데이터, 미디어 파일이 하나의 SoundBank에 저장됩니다. 이 전략에 대한 설명과 Wwise Authoring에서 구현하는 방법은 Wwise 도움말의 일체형 SoundBank를 참조하세요.

이 게임에는 SoundBank가 하나밖에 없으므로 게임을 초기화할 때 SoundBank를 불러오세요. 항상 그렇듯이 사운드 엔진을 먼저 초기화해야 합니다.

...
// 여기에서 사운드 엔진을 초기화하세요.
...
// Init 뱅크와 일체형 뱅크를 로드합니다.
AkBankID bankID; // 이 예제에서는 사용되지 않습니다.
AKRESULT eResult = AK::SoundEngine::LoadBank( L"Init.bnk", bankID );
if( eResult == AK_Success )
{
eResult = AK::SoundEngine::LoadBank( L"MyAllInOneBank.bnk", bankID );
}
...

여러 개의 완전한 SoundBank

이 전략은 모든 사운드가 게임 내 플레이어의 위치에 따라 달라지는 싱글 플레이어 게임에 적합합니다. 이 전략에 대한 설명과 Wwise Authoring에서 구현하는 방법은 Wwise 도움말의 여러 개의 완전한 SoundBanks를 참조하세요.

게임에서는 정확한 시간에 올바른 뱅크를 불러와야 합니다. 예를 들어 게임 초반에 일반 뱅크를 불러오고 플레이어의 실제 위치에 따라서 다른 적절한 뱅크를 불러올 수 있습니다. 일부 게임에서는 레벨 간 전환 효과를 위해 동시에 두 개 이상의 '레벨'을 로드할 만큼 충분한 메모리가 있어야 한다는 점을 주의하세요.

LoadBank() 대신 AkBankContent_All 을 사용하여 SoundBank를 준비할 수도 있습니다. 이 방법은 메모리에서 미디어가 복제되는 것을 방지하는 장점이 있습니다. 뱅크 준비 를 참조하세요.

...
// 여기에서 사운드 엔진을 초기화하세요.
...
// Init 뱅크와 Common 뱅크를 불러옵니다.
AkBankID bankID; // 이 예제에서는 사용되지 않습니다.
AKRESULT eResult = AK::SoundEngine::LoadBank( L"Init.bnk", bankID );
if( eResult == AK_Success )
{
eResult = AK::SoundEngine::LoadBank( L"CommonEvents.bnk", bankID );
}
...
// 실제 필요에 따라 코드 내 원하는 위치에서 다음 내용을 입력합니다.
eResult = AK::SoundEngine::LoadBank( L"Level_1.bnk", bankID );
...
eResult = AK::SoundEngine::LoadBank( L"Level_2.bnk", bankID );
...
eResult = AK::SoundEngine::LoadBank( L"Level_3.bnk", bankID );
...
eResult = AK::SoundEngine::UnloadBank( L"Level_1.bnk", NULL );
...
eResult = AK::SoundEngine::UnloadBank( L"Level_2.bnk", NULL );
...
eResult = AK::SoundEngine::UnloadBank( L"Level_3.bnk", NULL );

세부적인 미디어 관리

많은 에셋이 포함된 복잡한 게임의 경우 이 전략을 고려해보세요. 이 전략에 대한 설명과 Wwise Authoring에서 구현하는 방법은 Wwise 도움말의 세부적인 미디어 관리를 참조하세요.

게임을 시작할 때 일반적으로 사용하는 SoundBank를 로드하고 필요할 때마다 다른 SoundBank를 로드합니다. 예를 들어, 게임 초반에 Event SoundBank와 일반적인 발소리 SoundBank를 로드한 다음, 게임 내에서 플레이어의 위치에 따라 다른 SoundBank를 로드할 수 있습니다.

// Init과 EventBank를 불러옵니다
AkBankID bankID; // 이 예제에서는 사용되지 않습니다.
AKRESULT eResult = AK::SoundEngine::LoadBank( L"Init.bnk", bankID );
if( eResult == AK_Success )
{
eResult = AK::SoundEngine::LoadBank( L"EventBank.bnk", bankID );
}
if( eResult == AK_Success )
{
eResult = AK::SoundEngine::LoadBank( L"Common_Footstep_bank.bnk", bankID );
}
...
// 적절한 위치에 따라 다음 내용을 코드 내 원하는 곳에 입력합니다.
eResult = AK::SoundEngine::LoadBank( L"Winter_Footstep_bank.bnk", bankID );
...
eResult = AK::SoundEngine::LoadBank( L"Desert_Footstep_bank.bnk", bankID );
...
eResult = AK::SoundEngine::UnloadBank( L"Winter_Footstep_bank.bnk", NULL );
...
eResult = AK::SoundEngine::UnloadBank( L"Desert_Footstep_bank.bnk", NULL );

Action Event 준비하기

메모리 사용량을 낮추기 위해 높은 수준의 미디어 세분성이 필요하고 Event와 관련된 구조체 및 미디어를 관리하고 싶지 않은 경우 이 전략을 고려하세요. 이 전략에 대한 설명과 Wwise Authoring에서 구현하는 방법은 Wwise 도움말에서 Action Event 준비하기를 참조하세요.

게임을 시작할 때 Event의 SoundBank를 로드하고, 게임에서 필요할 때 Event를 준비합니다. 해당 구조체와 미디어는 자동으로 로드됩니다.

// 사운드 엔진을 초기화합니다.
AkInitSettings initSettings;
AkPlatformInitSettings platformInitSettings;
// 필요한 사항을 설정합니다.
...
// PrepareEvent와 관련된 사항을 설정합니다
initSettings.bEnableGameSyncPreparation = false; // 현재 예제에서는 사용되지 않습니다.
AKRESULT eResult = AK::SoundEngine::Init( initSettings, platformInitSettings );
if( eResult != AK_Success )
{
// 처리 오류
}
// Init 뱅크와 이벤트/구조체 뱅크를 불러옵니다.
AkBankID bankID; // 이 예제에서는 사용되지 않습니다.
AKRESULT eResult = AK::SoundEngine::LoadBank( L"Init.bnk", bankID );
if( eResult == AK_Success )
{
eResult = AK::SoundEngine::LoadBank( L"Events.bnk", bankID );
}
...
// 그런 다음, 코드 내 원하는 위치에서 다음과 같이 입력합니다.
const char * pEventsNameArray[1] = { "My_Event_Name" };
// 이벤트를 준비합니다:
eResult = AK::SoundEngine::PrepareEvent( Preparation_Load, pEventsNameArray, 1 ); // 1은 배열 크기임
// 이벤트 준비를 해제합니다:
eResult = AK::SoundEngine::PrepareEvent( Preparation_Unload, pEventsNameArray, 1 ); // 1은 배열 크기임

Event와 Game Sync 준비하기 (Switch와 State)

이 전략은 Action Event 준비하기 와 비슷하지만 Event가 준비될 때 로드되는 미디어를 더 많이 제어할 수 있습니다. 이 전략에 대한 설명과 Wwise Authoring에서 구현 구현하는 방법은 Wwise 도움말에서 Event와 Game Sync 준비하기 (Switch와 State)를 참조하세요.

AK::SoundEngine::PrepareEventAK::SoundEngine::PrepareGameSync 중 어느 것을 먼저 호출하는지는 중요하지 않습니다. State가 바뀔 때마다 Event와 게임 싱크를 서로 맞춰보고 이에 따라 미디어 풀이 업데이트됩니다.

// 사운드 엔진을 초기화합니다.
AkInitSettings initSettings;
AkPlatformInitSettings platformInitSettings;
// 필요한 사항을 설정합니다.
...
// PrepareEvent와 관련된 사항을 설정합니다.
////////////////////////////////////////////////////////////////
// bEnableGameSyncPreparation 플래그가 true로 설정되고
// 게임 싱크 매커니즘을 활성화합니다. false로 설정되면,
// 모든 게임 싱크에 연결된 미디어를 불러오며
// AK::SoundEngine:PrepareGameSyncs를 호출하지 않아도 됩니다.
//
// true로 설정되면, AK::SoundEngine:PrepareGameSyncs 호출로 게임 싱크가 활성화된 경우를 제외하고는
// 게임 싱크에 의존하는 미디어가 로드되지 않습니다.
////////////////////////////////////////////////////////////////
initSettings.bEnableGameSyncPreparation = true;
AKRESULT eResult = AK.SoundEngine.Init( initSettings, platformInitSettings );
if( eResult != AK_Success )
{
// 처리 오류
}
// Init 뱅크과 이벤트/구조체 뱅크를 불러옵니다.
AkBankID bankID; // 이 예제에서는 사용되지 않습니다.
AKRESULT eResult = AK::SoundEngine::LoadBank( L"Init.bnk", bankID );
if( eResult == AK_Success )
{
eResult = AK::SoundEngine::LoadBank( L"Events.bnk", bankID );
}
// ... 이 시점에서는,
// 두 이벤트가 로드되어있지만 준비되지는 않았습니다. 현재 불러온 미디어가 없습니다.
const char * pNameArray[1];
// 주요 캐릭터 발자국 소리 이벤트를 준비합니다.
pNameArray[0] = "Play_Maincharacter_FootSteps";
eResult = AK::SoundEngine::PrepareEvent( Preparation_Load, pNameArray, 1 ); // 1은 배열 크기임
// ... 이 시점에서는,
// 한 이벤트가 준비됐지만 아직 미디어는 불러오지 않았습니다.
// 이제 콘크리트 지표면은 게임에서 항상 사용 가능하기 때문에 다음을 처리합니다.
pNameArray[0] = "Concrete";
eResult = AK::SoundEngine::PrepareGameSyncs( Preparation_Load, in_eType, "GroundTexture", pNameArray, 1 );
// ... 이 시점에서는,
// 3개의 사운드 Sound_Concrete_main_1과 Sound_Concrete_main_2, Sound_Concrete_main_3가 로드됐습니다.
// 이제 주요 캐릭터가 눈이 덮인 지표면으로 들어간다고 가정합시다.
pNameArray[0] = "Snow";
eResult = AK::SoundEngine::PrepareGameSyncs( Preparation_Load, in_eType, "GroundTexture", pNameArray, 1 );
// ... 이 시점에서,
// 3개의 사운드, Sound_Snow_main_1, Sound_Snow_main_2 and Sound_Snow_main_3가 방금 로드됐습니다.
// 그런 다음 갑자기 Monster가 나타난다고 가정합시다.
pNameArray[0] = "Play_Monster_Footsteps";
eResult = AK::SoundEngine::PrepareEvent( Preparation_Load, pEventsNameArray, 1 ); // 1은 배열 크기임
// ... 이 시점에서,
// 6개의 사운드( Sound_Concrete_Monster_1.2.3 과 Sound_Snow_Monster_1.2.3 )가 방금 로드됐습니다.
// 그런 다음 플레이어가 몬스터로부터 달아나기 시작하고, 몬스터는 그 플레이어를 뒤쫓습니다.
// 플레이어와 몬스터는 멀리 달려가 더 이상 눈이 없는 곳까지 가게 됩니다.
pNameArray[0] = "Snow";
eResult = AK::SoundEngine::PrepareGameSyncs( Preparation_Unload, in_eType, "GroundTexture", pNameArray, 1 );
// ... 이 시점에서,
// 눈과 관련된 6개의 사운드( Sound_Snow_Monster_1.2.3 and Sound_Snow_main_1.2.3 )가 메모리에서 언로드됩니다.
...
참고
AKSOUNDENGINE_API AKRESULT PrepareEvent(PreparationType in_PreparationType, const char **in_ppszString, AkUInt32 in_uNumEvent)
Definition of data structures for AkAudioObject
AKSOUNDENGINE_API AKRESULT PrepareGameSyncs(PreparationType in_PreparationType, AkGroupType in_eGameSyncType, const char *in_pszGroupName, const char **in_ppszGameSyncName, AkUInt32 in_uNumGameSyncs)
AKSOUNDENGINE_API AKRESULT Init(AkInitSettings *in_pSettings, AkPlatformInitSettings *in_pPlatformSettings)
AkUInt32 AkBankID
Run time bank ID
Definition: AkTypes.h:75
AKRESULT
Standard function call result.
Definition: AkTypes.h:134
AKSOUNDENGINE_API AKRESULT LoadBank(const char *in_pszString, AkBankID &out_bankID, AkBankType in_bankType=AkBankType_User)
@ Preparation_Unload
PrepareEvent() will unload required information to play the specified event.
#define NULL
Definition: AkTypes.h:46
@ AK_Success
The operation was successful.
Definition: AkTypes.h:136
AKSOUNDENGINE_API void GetDefaultInitSettings(AkInitSettings &out_settings)
@ Preparation_Load
PrepareEvent() will load required information to play the specified event.
AKSOUNDENGINE_API AKRESULT UnloadBank(const char *in_pszString, const void *in_pInMemoryBankPtr, AkBankType in_bankType=AkBankType_User)
AKSOUNDENGINE_API void GetDefaultPlatformInitSettings(AkPlatformInitSettings &out_platformSettings)

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

지원이 필요하신가요?

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

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

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

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

Wwise를 시작해 보세요