バージョン

menu_open
Wwise SDK 2023.1.9
SoundBank統合のサンプル

以下のセクションで、さまざまなSoundBank管理戦略のサンプル統合をご紹介します。これらの戦略は、WwiseヘルプのSoundBank管理の戦略に記載されています。

注釈: PrepareEventの使用はLoadBankと同時に行えず、メモリのデータを使います。


All-in-one SoundBank

この戦略では、すべてのイベントコンテンツ、サウンド構造データ、メディアファイルを1つのSoundBankに保存します。この戦略の解説とWwise Authoringでの実装については、WwiseヘルプのAll-in-one SoundBankをご覧ください。

この例のゲームのSoundBankは1つだけなので、ゲームを初期化する時にロードします。通常どおり、まずはサウンドエンジンを初期化する必要があります。

...
// ここでサウンドエンジンを初期化します。
...
// InitバンクとAll-in-oneバンクをロードします。
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ヘルプの複数の完全なSoundBankをご覧ください。

ゲーム中に適切なタイミングで適切なバンクをロードします。例えば、ゲームの開始時に汎用バンクをロードし、プレイヤーのゲーム内での実際の位置によって他のバンクをロードすることができます。なおゲームによっては、レベル間の移動を可能にするため、一度に複数の「レベル」をロードするのに十分なメモリが必要となります。

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やゲームシンク(Switch、State)をプリペアするをご覧ください。

AK::SoundEngine::PrepareEventAK::SoundEngine::PrepareGameSync をコールする順番は重要ではありません。ステートが変化するたびに、Eventとゲームシンクをクロスマッチしてメディアプールを更新します。

// サウンドエンジンを初期化します。
AkInitSettings initSettings;
AkPlatformInitSettings platformInitSettings;
// Set the required settings.
...
// Set PrepareEvent related settings.
////////////////////////////////////////////////////////////////
// The flag bEnableGameSyncPreparation is set to true to activate
// the prepare gamesync mechanism. When set to false, the media
// associated with all game syncs is loaded and there is no need
// to call AK::SoundEngine:PrepareGameSyncs.
//
// When set to true, no media that is game sync dependent will be
// loaded unless the game sync is activated by calling AK::SoundEngine:PrepareGameSyncs
////////////////////////////////////////////////////////////////
initSettings.bEnableGameSyncPreparation = true;
AKRESULT eResult = AK.SoundEngine.Init( initSettings, platformInitSettings );
if( eResult != AK_Success )
{
// Handle error.
}
// Load Init and the event/structure bank.
AkBankID bankID; // このサンプルでは使用されません。
AKRESULT eResult = AK::SoundEngine::LoadBank( L"Init.bnk", bankID );
if( eResult == AK_Success )
{
eResult = AK::SoundEngine::LoadBank( L"Events.bnk", bankID );
}
// ... At this point,
// the two events are loaded, but not prepared. No media is currently loaded.
const char * pNameArray[1];
// Prepare the main character footstep event.
pNameArray[0] = "Play_Maincharacter_FootSteps";
eResult = AK::SoundEngine::PrepareEvent( Preparation_Load, pNameArray, 1 ); // 1 is the array size
// ... At this point,
// one event has been prepared, but no media has been loaded yet.
// Now since concrete is always available in the game.
pNameArray[0] = "Concrete";
eResult = AK::SoundEngine::PrepareGameSyncs( Preparation_Load, in_eType, "GroundTexture", pNameArray, 1 );
// ... At this point,
// the 3 sounds, Sound_Concrete_main_1, Sound_Concrete_main_2, and Sound_Concrete_main_3 are loaded.
// Now, let's say that the main character enters a land where there is snow.
pNameArray[0] = "Snow";
eResult = AK::SoundEngine::PrepareGameSyncs( Preparation_Load, in_eType, "GroundTexture", pNameArray, 1 );
// ... At this point,
// 3 more sounds just got loaded : Sound_Snow_main_1, Sound_Snow_main_2 and Sound_Snow_main_3
// Then let's say that a Monster suddenly appears.
pNameArray[0] = "Play_Monster_Footsteps";
eResult = AK::SoundEngine::PrepareEvent( Preparation_Load, pEventsNameArray, 1 ); // 1 is the array size
// ... At this point,
// 6 more sounds just got loaded ( Sound_Concrete_Monster_1.2.3 and Sound_Snow_Monster_1.2.3 )
// And now our player decides to run away from the monster, and the monster goes after them.
// They run so far that they arrive at a place where there is no snow anymore.
pNameArray[0] = "Snow";
eResult = AK::SoundEngine::PrepareGameSyncs( Preparation_Unload, in_eType, "GroundTexture", pNameArray, 1 );
// ... At this point,
// The 6 sounds that were related to snow ( Sound_Snow_Monster_1.2.3 and Sound_Snow_main_1.2.3 ) are unloaded from memory.
...
参照
AKSOUNDENGINE_API AKRESULT PrepareEvent(PreparationType in_PreparationType, const char **in_ppszString, AkUInt32 in_uNumEvent)
Audiokinetic namespace
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:131
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:133
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からはじめよう