プロジェクトごとに次のような2種類のバンクが存在します:初期化バンク(Initialization banks)とサウンドバンク(SoundBanks)。
各プロジェクトにつき1つのみ初期化バンクがあります。Wwise がサウンドバンクを生成すると、初期化バンクが自動的に作成され、“Init.bnk” と言う名前が付けられます。この特殊なバンクは、以下のようなプロジェクトに関する一般情報を含んでいます:
初期化バンクは言語非依存なので、全ての言語に対して1つのみの初期化バンクが生成されます。
ゲームの起動時、初期化バンクが最初にロードされる必要があります。このバンクが先にロードされていないと、サウンドバンクがロードされません。1つでもサウンドバンクがロードされたままになっていると、初期化バンクをアンロードできません。初期化バンクは、サウンドバンクの場合と同じ方法でロードされます。
|
Note: ソース、エフェクトまたはコーデックのプラグインを使用するプロジェクト用の初期化バンクは、これらのプラグインが前もってサウンドエンジンに登録されていないと、ロードできません。プラグイン登録に関する情報は、統合の詳細 - プラグイン と コーデックプラグインの統合 をご覧ください。 |
各サウンドバンクには以下が含まれています:
初期化バンクがロードされた後は、ゲーム中のどの時点でもサウンドバンクをロードおよびアンロードできます。イベントを格納するバンクが、イベントのトリガー実行の前にロードされていることを確認してください。イベントが、それに対応するバンクのロード前にポストされると、イベントは実行されません。
|
Caution: サウンドバンクは、初期化バンクに格納されている情報を必要とします。従って、作業対象のゲームは、同一の Wwise プロジェクトから生成された初期化バンクとサウンドバンクを使用しなければなりません。 |
当 SDK は、バンク内のアイテムにアクセスするために、文字列使用またはID使用の 2種類の方法を提供します。ゲームでいずれのオプションを使用するか決定する前に考慮すべき事項がいくつかあります:
文字列の使用
ID の使用
ほとんどのケースは、文字列の使用で対応できますが、メモリや CPU の使用に制限がある場合は、ID の使用を検討する必要があります。
ゲームで使用可能な Wwise オブジェクト(バンク、イベント、ゲームシンクなど)の ID は、小文字を32ビット整数にハッシュすることにより算出されます。
|
Tip: Wwise で、Project Settings ダイアログボックスの SoundBanks タブにある "Generate SoundBank content files(SoundBank コンテンツファイルを作成)" オプションを選択すると、各バンクに対応するテキストファイルが作成され、バンクに含まれるすべてのオブジェクトの名前と ID がこのテキストファイルに列挙されます。SoundBankのプロジェクト設定については、Wwise Help を参照してください。 |
AK::SoundEngine::GetIDFromString()
メソッドは、文字列から ID への実行時変換を行います。大文字と小文字の区別はされず、入力文字列は小文字に変換され、続いてハッシュ関数が適応されます。
例えば、名前によって識別されるイベントをポストしたい場合。最初の引数として文字列を持つ AK::SoundEngine::PostEvent()
のオーバーロードを使用することができます。
|
Note: サウンドエンジンは、内部的に Unicode 文字列を ID に変換し、最初の引数として ID を持つ PostEvent() のオーバーロードを呼び出します。文字列と ID オーバーロードの両方を持つ SDK のメソッドは、デバイス I/O を伴う AK::SoundEngine::LoadBank() のオーバーロードを除いて、すべて同様に動作します。これについては、バンクの識別 セクションで説明されています。 |
AkGameObjectID gameObj = 3; AK::SoundEngine::RegisterGameObj( gameObj ); AkPlayingID playingID = AK::SoundEngine::PostEvent( L"Play_Sound_01", // Name of the event (not case sensitive). gameObj // Associated game object ID );
実行時に文字列を ID に変換することなく、ID を使用して直接作業するには、"Generate header file(ヘッダファイルを生成)" オプションを選択した状態で、バンクを生成する必要があります。このオプションは、Wwise 内 Project Settings ダイアログボックスの SoundBanks タブにあります。Wwise_IDs.h という名前のヘッダファイルには、ゲームに含まれる必要のある全てのIDが記載されています。これは、バンクが生成されるたびに更新されます。
Wwiseにおけるバンク生成に関する詳細は、Wwise Helpを参照してください。
以下は、Wwise に生成される非常に単純なヘッダファイルの例です:
/////////////////////////////////////////////////////////////////////// // // Audiokinetic Wwise generated include file. Do not edit. // /////////////////////////////////////////////////////////////////////// #ifndef __WWISE_IDS_H__ #define __WWISE_IDS_H__ namespace AK { namespace EVENTS { static const AkUniqueID PLAY_SOUND_01 = 2580655723U; static const AkUniqueID PLAY_SOUND_02 = 2580655720U; static const AkUniqueID PLAY_SOUND_03 = 2580655721U; } // namespace EVENTS namespace BANKS { static const AkUniqueID INIT = 1355168291U; static const AkUniqueID BANK_01 = 1576947084U; static const AkUniqueID BANK_02 = 1819748216U; } // namespace BANKS } // namespace AK #endif // __WWISE_IDS_H__
Wwise により生成されるヘッダファイルには、各バンク、イベント、ステート、スイッチなどごとにエントリが追加されるので、上記の例よりもはるかに多くの情報を含みます。
|
Caution: ID で作業する場合、新しいバンクの生成時に、.h ファイルを最新の状態に保っておくことが大切です。さもなければ、ID の不整合および/またはコンパイルエラーが発生する可能性があります。 |
例えば、イベントの ID を使用して、イベントをポストしたい場合。生成されるヘッダファイル "Wwise_IDs.h" が含まれている必要があります。このためには、ID を最初の引数として使用する PostEvent()
オーバーロードを使用すればよいだけです。
#include "Wwise_IDs.h" // ... AkGameObjectID gameObj = 3; AK::SoundEngine::RegisterGameObj( gameObj ); AkPlayingID playingID = AK::SoundEngine::PostEvent( AK::EVENTS::PLAY_SOUND_01, // Unique ID of the Event gameObj // Associated game object ID );
ゲーム内のその他すべての Wwise オブジェクト同様、バンクは、その名前をハッシュすることにより生成される ID で識別されます。バンクのロードとアンロードには常にある時点で I/O デバイスへのアクセスを伴います。
AK::SoundEngine::LoadBank()
のオーバーロードの1つは、ポインタとサイズを使用します。I/O を手動で実行し、サウンドエンジンにコンテンツの準備を指示したい場合にこれを使用します。バンクがアンロードされるまでポインタが有効である必要があります。
バンク ID は、バンクに格納されています。 AK::SoundEngine::LoadBank()
の メモリのオーバーロードは、これを解析し、その戻り値を返します。(AK::SoundEngine::UnloadBank()
の ID のオーバーロードを使用して)バンクをアンロードするために、これを保持する必要があります。
Wwise サウンドエンジンが直接 I/O をアクセスすることはなく。I/O へのすべての要求は、そのインターフェースが AK::IAkStreamMgr
(ストリーミング/ストリームマネージャ を参照)と定義される Stream Manager を介して実行されます。このモジュールはオーバーライドすることができますが、Audiokinetic のデフォルト実装は、さらにI/O転送とファイルシステムへの低レベルアクセス、およびそのインターフェースが AK::IAkLowLevelIO
と定義される AK:: AK::IAkStreamMgr
実装に固有の低レベル IO モジュールの抽象化を定義します。低レベル IO のデフォルト実装が用意されていますが、これはファイルのロケーションを解決するために、独自に置き換えられるようになっています (低レベル I/O を参照)。
Stream Manager と低レベル IO は、ファイルを開くために、文字列と ID のそれぞれによって、2つのオーバーロードを定義します。同様に、サウンドエンジン API は、文字列または IDを使用する LoadBank()
のオーバーロードを提供します。サウンドエンジンに呼び出されてしまう AK::IAkLowLevelIO::Open()
のバージョンは、 LoadBank()
のいずれのオーバーロードがゲームに使用されたかに依存しています。これはまた、サウンドエンジンが、Project Settings ダイアログボックスの SoundBanks タブにある "Use SoundBank names(SoundBank 名を使用)" オプションを使用して生成されたかどうかにも依存します。SoundBankのプロジェクト設定については、Wwise Help を参照してください。
サウンドバンク生成のために Wwise で利用可能な設定の1つに、"Use SoundBank names(SoundBank 名を使用)" というオプションがあります。これは、I/O およびファイルシステムについて、バンクがサウンドエンジンへロードされる方法に影響を与えます。
|
Warning: SDK で提供される低レベル IO のデフォルト 実装 (
ただし、ファイルパッケージベースの低レベル IO ( |
オプションが選択されていない場合、Wwise は次の形式の名前を持つバンクファイルを生成します:
ここで、"ID" は、バンク名をハッシュして生成される数値型の 32 ビット ID です(AK::SoundEngine::GetIDFromString()
を参照)。
このモードでは、バンクは他のバンクをこれらの ID を使用して(参照されるバンクの名前は、参照を行うバンクには格納されていません)内部的に参照します。したがって、PrepareEvent() コマンドから発行される AK::IAkLowLevelIO::Open()
へのすべての呼び出しは、ID バージョンを使用します。この ID を有効なファイル記述子に解決するのが低レベル IO の役目です。
AK::IAkLowLevelIO::Open()
の ID バージョン内では、SDK で提供される低レベル IO のデフォルト実装 (CAkDefaultLowLevelIO
、 デフォルト低レベル I/O の実装 を参照)が ID を持つ文字列を作成し、".bnk" を加え、プラットフォーム固有のファイルオープンのネイティブメソッドを呼び出します( 基本的なファイルロケーション を参照)。
|
Tip: バンクの ID は、ヘッダファイル Wwise_IDs.h にあります- ID 使用の有効化 をご覧ください。 |
オプションが選択されてる場合、Wwise はバンクの元の名前に拡張子 BNK を追加してバンクファイルを生成します。
バンクは、参照対象となる他のバンクの名前を格納しています。サウンドエンジンのバンクマネージャが、 PrepareEvent()
コマンドに従って、I/O から別のバンクをロードする必要がある場合、マネージャは AK::IAkLowLevelIO::Open()
の文字列バージョンを使用します。 AK::IAkLowLevelIO::Open()
の文字列バージョンは、".bnk" 拡張子で連結されたバンクの名前を受け取ります。プラットフォームのファイルシステムにアクセスする前に、バンクのロケーションのパスをプリペンドしたり、必要な変換を実行するのが低レベル IO の役目です。
Use SoundBank Names オプションを使用して作成されたバンクは、参照するバンクの ID だけでなく名前も格納するため、やや大きめです。
|
Note: ディスク上にある生成済みバンクの名前と ID は、SoundBanksInfo.xml というファイルに列挙されています- SoundBanksInfo.xml セクションをご覧ください。 |
|
Tip: UnloadBank() の文字列のオーバーロードでは、文字列が内部的に ID に変換され、それから ID のオーバーロードが呼び出されます。文字列のオーバーロードでバンクをロードし、戻された関連バンク ID を保持し、後ほどバンクをアンロードするためにこの ID を使用することが可能です。 |
.
Wwise が言語固有の SoundBank を作成すると、同時に、同じ ID /ファイル名を持つファイルが言語固有のデータを持つすべての言語に対して生成されます。これらの特殊な言語ファイルは、独立した言語固有のディレクトリに格納されています。しかしながら、サウンドエンジンAPIのバンクロードのメソッド (LoadBank()
) には、どの言語固有ディレクトリからファイルが開かれるべきかを指定するフラグがありません。ファイルロケーションは、これをオーバーライドすることを選択した場合、低レベル IO またはストリームマネージャにより解決されます。
ストリームマネージャ API は、言語固有性を指定するフラグを含む、(ファイルI/Oの)ストリームを作成するためのメソッドを公開します。このフラグは、低レベル IO まで伝播されます。詳細は、ファイルシステムフラグ をご覧ください。
サウンドエンジンのバンクマネージャは、ロードされる必要のあるサウンドバンクが言語固有のデータを含んでいるかどうかを認識しないので、ストリームマネージャに、まず言語固有のディレクトリ内でファイルを検索するよう要求します (bIsLanguageSpecific
は True
)。このプロセスが失敗した場合、バンクマネージャは再試行を行いますが、今度はストリームマネージャに共通ディレクトリを検索するよう要求します(bIsLanguageSpecific
は False
)。
ファイルロケーションに関する議論は、 ファイルロケーションの解決 を参照してください。間違ったロケーションでサウンドバンクを開くことを避けるためのヒントは、デフォルト実装について解説しているセクション (基本的なファイルロケーション) をご覧ください。
バンクは、常に参照対象であるストリーミングされたオーディオファイルのIDを格納します。サウンドエンジンが、ストリーミングされたソースの再生を開始したい場合、バンクから ID を取得し、ストリームマネージャの ID のオーバーロードを呼び出します。これにより、AK::IAkLowLevelIO::Open()
の IDのオーバーロードが呼び出されます。低レベル IO のデフォルト実装は、この ID を持つ文字列を作り、ファイル形式に対応した拡張子を連結します。命名スキームを使用して、ストリーミングされたファイルのコピーを作成し、Generated SoundBanks (生成されたサウンドバンク)ディレクトリに格納したい場合は、Project Settings ダイアログボックスの SoundBanks タブにある "Copy Streamed Files(ストリーミングファイルをコピーする)"オプションを使用してください。この操作は、生成後のステップとして定義されています。つまり、サウンドバンク生成の直後に実行されることを意味しています。サウンドバンクのプロジェクト設定に関する詳細な説明は、Wwise Help を参照してください。
Wwise で、バンクが生成されるたびに、各プラットフォームに対して SoundBanksInfo.xml という名前のファイルが SoundBank パスに直接生成されます。これは、特定のプロジェクトに対してサウンドエンジンが必要とするすべてのファイルを記述する XML ファイルです。
そのコンテンツは、かなり自明です。最初のセクション (StreamedFiles) は、すべてのストリーミング済みオーディオファイルを、それらの ID、元の名前、言語、フルパスなどを指定して列挙します。2番目のセクション (SoundBanks) も、バンクファイルに対して同様の動作を行います。また、各バンクはそれが参照するストリーミングオーディオファイルを表示します。
バンクロード API に関する完全な説明は、 バンクのロード を参照してください。