バージョン
このメソッドは、以下の場合に適しています。
メモリの使用量を抑えるには、メディアを細かく分ける必要がある。
メディアアセットを複数のSoundBankに分割する手間を省きたい場合。
スイッチやステートに基づいて、異なるサウンドを再生するイベントがプロジェクトにある。
SwitchやStateに基づいてミュージックを再生する、インタラクティブミュージックがプロジェクトにある。
基本的にメソッドNo.4と同じですが、イベントをプリペアする時にロードされるメディアを、より細かくコントロールします。このメソッドでは、プリペアされたイベントと、現在アクティブなゲームシンクの、両方に関連するメディアだけが、メモリにロードされます。
例えば、シンプルなプロジェクトに、2つのイベント「Play_Maincharacter_FootSteps(メインキャラクターの足音を再生)」と「Play_Monster_Footsteps(モンスターの足音を再生)」があるとします。それぞれのイベントは、キャラクターが移動中の地面素材に合わせて、異なるSwitch Containerで、異なるサウンドをランダムに再生します。Switch Groupの名前は「GroundTexture」であり、可能なStateは、「Snow」「Concrete」「Sand」の3つです。
Wwiseに表示されるSwitch Containerの階層は、以下の通りです。
この例では、メモリにロードされる可能性のあるサウンドが、18個(6つのグループに、それぞれ3つのサウンド)あります。そこで「メソッドNo.4: アクションイベントをプリペアする」を採用できますが、イベントごとにメモリにロードされるサウンドの数、つまり分割の細かさは、6個までとなります。
そこで「メソッドNo.3: メディアのマイクロマネジメント」を採用して、より細かく分割できますが、このシンプルなプロジェクトに対して、SoundBankが6個も必要になります(現実のプロジェクトでは、SoundBank数がすぐに増えてしまいます)。モンスターが出現した時に、どのような地面素材が可能かを確認してから、適切なSoundBankをロードする必要があります。
メソッドNo.5では、発生する可能性のあるイベントとゲームシンクを指定するだけで、あとは適切なメディアだけがロードされます。さらにシンプルにするために、全てのメディアを、1つのSoundBankにまとめることもできます。
イベントやゲームシンクをプリペアする場合に、バンクを設定するには:
“Events”というSoundBankを1つ作成して、SoundBank Editorにロードする。
SoundBank Editorの、Addタブに、2つのイベントをドラッグする。
Media 列のチェックボックスを外し、Events列とStructures列のチェックボックスだけを選択したままにする。 PrepareEvent()を使用する場合は、メディアをバンクでなくディスクから直接ロードする必要がある。
注釈 | |
---|---|
今回の例では、全てのイベントと構造を1つのSoundBankに入れてあります。これは小規模なプロジェクトでは可能ですが、一般的には、コンテンツを複数のSoundBankに分割した方が良いでしょう。また、それぞれのイベントにロードすべき他のSoundBankへのレファレンスが含まれるため、改めてロードしたりSDKコマンドからプリペアしなくてもよい構造用バンクを別に作成することもできます。 |
これらのSoundBankを生成して、生成されたSoundBankフォルダを、ゲームアプリケーションにコピーする。
注釈 | |
---|---|
1つのSoundBankに入っている構造データを、ランタイムに分割することはできません。このため、AK::SoundEngine::PrepareEvent()を使っている時に、他のSoundBankに入っている構造データが必要になると、そのSoundBankに入っている全ての構造データが、同時にロードされます。事前にプロジェクトの構造データを複数のSoundBankに分割すれば、メモリにロードされてしまう不要な情報の量を抑えることができます。 |
ゲーム中に、イベントとゲームシンクをプリペアするには:
ゲーム側が2つのイベントを必要とする前に、SoundBank「Event」をロードする。
素材「Concrete」を、常にアクティブな状態にしておく。
常に、メインキャラクターの足音イベント(Main character footstep event)を、プリペアする。
地面素材が近くにある時は、ゲームシンクをアクティブにする。
ゲーム中にゲームシンクをプリペアする方法として、以下のサンプルコードを参照してください。まず最初に、サウンドエンジンを初期化して、bEnableGameSyncPreparationフラグなどの必要設定を、設定する。
// Initializing the sound engine. AkInitSettings initSettings; AkPlatformInitSettings platformInitSettings; AK::SoundEngine::GetDefaultInitSettings( initSettings ): AK::SoundEngine::GetDefaultPlatformInitSettings( platformInitSettings ): // Set the required settings. ... // Set PrepareEvent related settings. // The flag bEnableGameSyncPreparation is set to true to activate the prepare // Game Sync 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. }
次に、Initバンクと、イベントのSoundBankをロードする。
// Load Init bank and the Event/structure bank. AkBankID bankID; // Not used in the sample. 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 AkOSChar** pNameArray = new const AkOSChar*[1]; // Prepare the main character footstep event. pNameArray[0] = L"Play_Maincharacter_FootSteps"; eResult = AK::SoundEngine::PrepareEvent(AK::SoundEngine::Preparation_Load, pNameArray, 1); // 1 is the array size. // ... At this point, one Event has been prepared, but no media has been loaded. // Now, since concrete is always available in the game. pNameArray[0] = L"Concrete"; eResult = AK::SoundEngine::PrepareGameSyncs(AK::SoundEngine::Preparation_Load, AkGroupType::AkGroupType_Switch, L"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] = L"Snow"; eResult = AK::SoundEngine::PrepareGameSyncs(AK::SoundEngine::Preparation_Load, AkGroupType::AkGroupType_Switch, L"GroundTexture", pNameArray, 1 ); // ... At this point, the 3 sounds (Sound_Snow_main_1, Sound_Snow_main_2, and Sound_Snow_main_3) // just got loaded. // Then let's say that a monster suddenly appears. pNameArray[0] = L"Play_Monster_Footsteps"; eResult = AK::SoundEngine::PrepareEvent( AK::SoundEngine::Preparation_Load, pNameArray, 1 ); // 1 is the array size. // ... At this point, 6 more sounds ( Sound_Concreate_Monster_1.2.3 and Sound_Snow_Monster_1.2.3 ). // And now our player decides to run away from the monster, which goes after them. // They run so far that they arrive at a place where there is no longer snow. pNameArray[0] = L"Snow"; eResult = AK::SoundEngine::PrepareGameSyncs( AK::SoundEngine::Preparation_Unload, AkGroupType::AkGroupType_Switch, L"GroundTexture", pNameArray, 1 ); // ... At this point,the 6 snow-related sounds (Sound_Snow_Monster_1.2.3 and Sound_Snow_main_1.2.3 ) // are unloaded from memory. ...