目次

概説

バンクの種類

プロジェクトごとに次のような2種類のバンクが存在します:初期化バンク(Initialization banks)とサウンドバンク(SoundBanks)。

初期化バンク

各プロジェクトにつき1つのみ初期化バンクがあります。Wwise がサウンドバンクを生成すると、初期化バンクが自動的に作成され、“Init.bnk” と言う名前が付けられます。この特殊なバンクは、以下のようなプロジェクトに関する一般情報を含んでいます:

  • バス階層
  • State(ステート)
  • Switch(スイッチ)
  • RTPC
  • Bus Effects

初期化バンクは言語非依存なので、全ての言語に対して1つのみの初期化バンクが生成されます。

ゲームの起動時、初期化バンクが最初にロードされる必要があります。このバンクが先にロードされていないと、サウンドバンクがロードされません。1つでもサウンドバンクがロードされたままになっていると、初期化バンクをアンロードできません。初期化バンクは、サウンドバンクの場合と同じ方法でロードされます。

Note.gif
注釈: ソース、エフェクトまたはコーデックのプラグインを使用するプロジェクト用の初期化バンクは、これらのプラグインが前もってサウンドエンジンに登録されていないと、ロードできません。プラグイン登録に関する情報は、統合の詳細 - プラグインコーデックプラグインの統合 をご覧ください。

サウンドバンク

各サウンドバンクには以下が含まれています:

  • Event(イベント)の定義
  • サウンド構造情報(サウンド、コンテナ、ミュージックオブジェクト、アクターミキサーなど)
  • メディア:
    • サウンドデータ(メモリ内サウンド用)
    • プリフェッチサウンドデータ(ゼロレイテンシーのストリーミングサウンド用)
    • ストリーミングオーディオファイルへの参照(ファイルID)

初期化バンクがロードされた後は、ゲーム中のどの時点でもサウンドバンクをロードおよびアンロードできます。イベントを格納するバンクが、イベントのトリガー実行の前にロードされていることを確認してください。イベントが、それに対応するバンクのロード前にポストされると、イベントは実行されません。

Caution.gif
注意: サウンドバンクは、初期化バンクに格納されている情報を必要とします。従って、作業対象のゲームは、同一の Wwise プロジェクトから生成された初期化バンクとサウンドバンクを使用しなければなりません。

ID または文字列の使用(Unicode または ANSI)

当 SDK は、バンク内のアイテムにアクセスするために、文字列使用またはID使用の 2種類の方法を提供します。ゲームでいずれのオプションを使用するか決定する前に考慮すべき事項がいくつかあります:

  • 読みやすいコードを使用することの重要性
  • 開発環境の他の領域における文字列の使用
  • CPU 使用率
  • メモリ使用量

文字列の使用

  • コードが読みやすくなるので、開発に適している。
  • 通常文字列を使用する開発環境に適している。
  • 文字列をサウンドエンジンで使用されるIDに変換するのに必要とされる CPU が少量である。しかしながら、1ゲームフレームごとに何千もの文字列が変換されない限り、ほとんどのゲームは CPU 使用率の違いに影響を受けない。
  • 文字列はサウンドエンジンに保存されないので、文字列がすでにゲームエンジンで使用されている場合、追加的なメモリが使用されない。ゲームが文字列を使用しない場合は、変換される前の文字列を保存するために、ゲーム側でいくらかのメモリが使用される。

ID の使用

  • コードが読みにくいので、開発中に発生する問題のトラブルシューティングがより難しくなる。
  • サウンドエンジンが内部的に ID を使用するため、追加的な CPU の使用を必要としない。
  • 追加的なメモリを必要としない。

ほとんどのケースは、文字列の使用で対応できますが、メモリや CPU の使用に制限がある場合は、ID の使用を検討する必要があります。

文字列の変換

ゲームで使用可能な Wwise オブジェクト(バンク、イベント、ゲームシンクなど)の ID は、小文字を32ビット整数にハッシュすることにより算出されます。

Tip.gif
Tip: Wwise で、Project Settings ダイアログボックスの SoundBanks タブにある "Generate SoundBank content files(SoundBank コンテンツファイルを作成)" オプションを選択すると、各バンクに対応するテキストファイルが作成され、バンクに含まれるすべてのオブジェクトの名前と ID がこのテキストファイルに列挙されます。SoundBankのプロジェクト設定については、Wwise Help を参照してください。

AK::SoundEngine::GetIDFromString() メソッドは、文字列から ID への実行時変換を行います。大文字と小文字の区別はされず、入力文字列は小文字に変換され、続いてハッシュ関数が適応されます。

例:Unicode 文字列の使用

例えば、名前によって識別されるEventをポストしたい場合。最初の引数として文字列を持つ AK::SoundEngine::PostEvent() のオーバーロードを使用することができます。

Note.gif
注釈: サウンドエンジンは、内部的に 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 に変換することなく、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 により生成されるヘッダファイルには、各バンク、Event、State、Switchなどごとにエントリが追加されるので、上記の例よりもはるかに多くの情報を含みます。

Caution.gif
注意: ID で作業する場合、新しいバンクの生成時に、.h ファイルを最新の状態に保っておくことが大切です。さもなければ、ID の不整合および/またはコンパイルエラーが発生する可能性があります。

例:ID の使用

例えば、Eventの ID を使用して、Eventをポストしたい場合。生成されるヘッダファイル "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 を参照してください。

SoundBank 名の使用

サウンドバンク生成のために Wwise で利用可能な設定の1つに、"Use SoundBank names(SoundBank 名を使用)" というオプションがあります。これは、I/O およびファイルシステムについて、バンクがサウンドエンジンへロードされる方法に影響を与えます。

Warning.gif

警告: SDK で提供される低レベル IO のデフォルト 実装 (CAkDefaultLowLevelIOデフォルト低レベル I/O の実装 参照) を使用する場合は、次の制限が適用されます:

  • Use SoundBank names がチェックされた場合、名前ベースのバージョンの LoadBank() (文字列パラメータを持つもの) のみが動作します。
  • Use SoundBank names がチェックされていない場合、ID ベースのバージョンの LoadBank() (AkBankID パラメータを持つもの) のみが動作します。

ただし、ファイルパッケージベースの低レベル IO (CAkFilePackageLowLevelIOサンプルファイルパッケージ 低レベルI/O 実装チュートリアル 参照) を使用する場合、 Use SoundBank names 設定に関係なく、LoadBank() の両方のオーバーロードを使用することができます。

"Use SoundBank Names" オプションを選択しない場合

オプションが選択されていない場合、Wwise は次の形式の名前を持つバンクファイルを生成します:

  • ID.bnk.

ここで、"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.gif
Tip: バンクの ID は、ヘッダファイル Wwise_IDs.h にあります- ID 使用の有効化 をご覧ください。

"Use SoundBank Names" オプションを選択する場合

オプションが選択されてる場合、Wwise はバンクの元の名前に拡張子 BNK を追加してバンクファイルを生成します。

バンクは、参照対象となる他のバンクの名前を格納しています。サウンドエンジンのバンクマネージャが、 PrepareEvent() コマンドに従って、I/O から別のバンクをロードする必要がある場合、マネージャは AK::IAkLowLevelIO::Open() の文字列バージョンを使用します。 AK::IAkLowLevelIO::Open() の文字列バージョンは、".bnk" 拡張子で連結されたバンクの名前を受け取ります。プラットフォームのファイルシステムにアクセスする前に、バンクのロケーションのパスをプリペンドしたり、必要な変換を実行するのが低レベル IO の役目です。

Use SoundBank Names オプションを使用して作成されたバンクは、参照するバンクの ID だけでなく名前も格納するため、やや大きめです。

Note.gif
注釈: ディスク上にある生成済みバンクの名前と ID は、SoundBanksInfo.xml というファイルに列挙されています- SoundBanksInfo.xml セクションをご覧ください。
Tip.gif
Tip: UnloadBank() の文字列のオーバーロードでは、文字列が内部的に ID に変換され、それから ID のオーバーロードが呼び出されます。文字列のオーバーロードでバンクをロードし、戻された関連バンク ID を保持し、後ほどバンクをアンロードするためにこの ID を使用することが可能です。

.

言語固有の ("Voice" および "Mixed") Soundbanks

Wwise が言語固有の SoundBank を作成すると、同時に、同じ ID /ファイル名を持つファイルが言語固有のデータを持つすべての言語に対して生成されます。これらの特殊な言語ファイルは、独立した言語固有のディレクトリに格納されています。しかしながら、サウンドエンジンAPIのバンクロードのメソッド (LoadBank()) には、どの言語固有ディレクトリからファイルが開かれるべきかを指定するフラグがありません。ファイルロケーションは、これをオーバーライドすることを選択した場合、低レベル IO またはストリームマネージャにより解決されます。

ストリームマネージャ API は、言語固有性を指定するフラグを含む、(ファイルI/Oの)ストリームを作成するためのメソッドを公開します。このフラグは、低レベル IO まで伝播されます。詳細は、ファイルシステムフラグ をご覧ください。

サウンドエンジンのバンクマネージャは、ロードされる必要のあるサウンドバンクが言語固有のデータを含んでいるかどうかを認識しないので、ストリームマネージャに、まず言語固有のディレクトリ内でファイルを検索するよう要求します (bIsLanguageSpecificTrue)。このプロセスが失敗した場合、バンクマネージャは再試行を行いますが、今度はストリームマネージャに共通ディレクトリを検索するよう要求します(bIsLanguageSpecificFalse)。

ファイルロケーションに関する議論は、 ファイルロケーションの解決 を参照してください。間違ったロケーションでサウンドバンクを開くことを避けるためのヒントは、デフォルト実装について解説しているセクション (基本的なファイルロケーション) をご覧ください。

ストリーミングオーディオファイル

バンクは、常に参照対象であるストリーミングされたオーディオファイルのIDを格納します。サウンドエンジンが、ストリーミングされたソースの再生を開始したい場合、バンクから ID を取得し、ストリームマネージャの ID のオーバーロードを呼び出します。これにより、AK::IAkLowLevelIO::Open() の IDのオーバーロードが呼び出されます。低レベル IO のデフォルト実装は、この ID を持つ文字列を作り、ファイル形式に対応した拡張子を連結します。命名スキームを使用して、ストリーミングされたファイルのコピーを作成し、Generated SoundBanks (生成されたサウンドバンク)ディレクトリに格納したい場合は、Project Settings ダイアログボックスの SoundBanks タブにある "Copy Streamed Files(ストリーミングファイルをコピーする)"オプションを使用してください。この操作は、生成後のステップとして定義されています。つまり、サウンドバンク生成の直後に実行されることを意味しています。サウンドバンクのプロジェクト設定に関する詳細な説明は、Wwise Help を参照してください。

SoundBanksInfo.xml

Wwise で、バンクが生成されるたびに、各プラットフォームに対して SoundBanksInfo.xml という名前のファイルが SoundBank パスに直接生成されます。これは、特定のプロジェクトに対してサウンドエンジンが必要とするすべてのファイルを記述する XML ファイルです。

そのコンテンツは、かなり自明です。最初のセクション (StreamedFiles) は、すべてのストリーミング済みオーディオファイルを、それらの ID、元の名前、言語、フルパスなどを指定して列挙します。2番目のセクション (SoundBanks) も、バンクファイルに対して同様の動作を行います。また、各バンクはそれが参照するストリーミングオーディオファイルを表示します。

バンクのロード

バンクロード API に関する完全な説明は、 バンクのロード を参照してください。

参照: