Event-Based Packagingとは?
少し前に、Wwise 2019.2のUE4インテグレーションで、イベントベースパッケージング(Event-Based Packaging、EBP)という新しいアセット管理のワークフローが発表されました。SoundBankの従来のワークフローと異なり、この新しいパイプラインではEventがパッケージングされ、1つのEventの様々なリソースが、1つのSoundBankとしてパッケージングされます。
さて、そんなことをするメリットは?Wwiseの従来のパイプラインでは、ユーザーが自分でSoundBankの編成方法を決めてきました。大規模なプロジェクトでは、編成するのに時間がかかることが珍しくありません。また、手作業で整理して管理するので、リソースを読み込むときに冗長性が生じるのは、ほぼ避けられません。EBPの新しいワークフローでは、あるEventに対応する各種リソースは自動的にSoundBankにパッケージングされ、そのEventの .uasset に格納されます。Eventが呼び出されると、そのEventに対応するメディアリソースだけがロードされるので、結果的に、必要なリソース以外はロードされません。つまり、リソースの冗長の発生も根本的に排除されるのです。また、1つの SoundBank に1つのEventのリソースしか入っていないので、ほかのEventからリソースへのアクセスを妨げてしまう不安もなく、柔軟にアンロードできます。
この記事では、EBPワークフローで使用される主要なリソースと、それをロードするプロセスを紹介し、みなさんが新しいパイプラインを理解できるようにしたいと思います。
EBPとWAAPIの関係
UE4でイベントベースのパッケージングを自動化するには、Eventや、Eventに対応するサウンドメディアとの関係を取得する必要があります。この段階でEBPパイプラインが依存するのが、 WAAPI です。WAAPIは、Wwise Authoring APIの略で、外部アプリケーションとWwise Authoringツールのやりとりを可能にするAPIです。ユーザーはこれらAPIを呼び出してWwiseオーサリングツールを制御できるので、WAAPIはUE4プロジェクトとWwiseプロジェクトの橋渡し役ととらえることができます。
Wwise AuthoringツールでEventを作成すると、登録済みコールバック関数を通して操作を指示されたUE4インテグレーションが、該当する event.uasset を自動的に作成します。同様に、ユーザーがUE4のWAAPI Pickerパネルで、Generate Sound Dataボタンをクリックすると、Wwise AuthoringツールでGenerate SoundBanksの処理が実行されます。EPBのワークフローで、確実にUE4とWwiseプロジェクトを常に同期されるように、 WAAPI が使われます。
SoundBankを生成するには、WAAPIを介してWwiseに接続するのが望ましいですが、これがSound Dataを生成する唯一の方法ではありません。WAAPIを使ってWwise Authoringツールに接続できない場合は、Wwise PickerウィンドウのGenerate Sound Dataボタンをクリックして、 Wwise Console で生成処理を開始できます。この場合、WAAPIよりもシステムI/Oコールが多くなるので生成時間が長くなりますが、出てくるアセットは同じです。また、UnrealのBuildメニューの、Audiokineticセクションにある、Generate Sound Dataダイアログも利用できます。
UE4のWwiseリソース
サウンド開発の過程で、ユーザーはEvent、State、Switch、RTPC、Bank、Auxiliary Bus、そして各種MediaリソースをWwiseで使いこなしながら、プロジェクトの音の世界を構築して編成していきます。これらのリソースはすべて、UE4で「.uasset」として存在し、デフォルトで Content/WwiseAudio/ フォルダに保存されます。プロジェクトのWwiseリソースをどこに保存するかは、UE4 Project SettingsのWwise Integration Settingsセクションにある、Wwise Sound Data Folderの設定で調整できます。
以下の表は、Wwiseリソースの該当するクラスと、UE4内の保存場所の一覧です。
TYPE | CLASS | PATH |
Bank | UAkAudioBank | Content/ |
RTPC | UAkRtpc | Content/WwiseAudio/Game_Parameters/ |
State | UAkStateValue | Content/WwiseAudio/States/ |
Switch | UAkSwitchValue | Content/WwiseAudio/Switches/ |
Event | UAkAudioEvent | Content/WwiseAudio/Events/ |
InitBank | UAkInitBank | Content/WwiseAudio/ |
Auxiliary Bus | UAkAuxBus | Content/WwiseAudio/Master-Mixer_Hierarchy/ |
AcousticTexture | UAkAcousticTexture | Content/WwiseAudio/Virtual_Acoustics/ |
Media | UAkMediaAsset | Content/WwiseAudio/Media/ |
ExternalSource | UAkExternalMediaAsset | Content/WwiseAudio/ExternalSources/ |
Localized | UAkLocalizedMediaAsset | Content/WwiseAudio/Localized/ |
Wwise
リソースから派生したこれらのクラスをオブジェクトにするには、デシリアライズが必要です。デシリアライズとは、バイトストリームをメモリ上のオブジェクトに変換する処理です。次の図は、Wwiseの全リソースのクラス図です。全リソースの派生関係を見ることができます。
ゲームでは、これらのリソースを、開発者がリソースリファレンスやC++コードでロードできます。シーンにドラッグ&ドロップしたオブジェクトや、Componentプロパティで参照したリソースの場合、Componentオブジェクトがインスタンス化されると、その中のWwiseリソースもロードされます。また、これらのリソースは、UE4の LoadObject() 関数を呼び出してロードすることもできます。
エディタで UAKAudioType クラスから派生したリソースをロードするタスクは AkAssetDatabase クラスが行い、このクラスのコンストラクタが onAssetAdded 、 onAssetRemoved 、 onAssetRenamed の3つのEventを登録します。このうち、 onAssetAdded が全リソースのロードを処理する役割を担います。UE4エンジンのエディタを開いてみると、実際に現在のマップのWwiseリソースがすべてロードされています。
media.uasset のロードは、 event.uasset のインスタンス化のときに実行します。ロード処理の詳細については後述します。では、最も重要なリソースである events.uasset と media.uasset の2つを見ていきます。
EBS(イベントベースパッケージング)の概要
ユーザーが一番頻繁に接するリソースは、ゲーム内の様々なEventです。Wwise Authoring ツールのEventと、UE4プロジェクトの event.uasset リソースは、1対1の関係です。Eventを使うのは再生、一時停止、SwitchやStateの設定など、様々なアクションを実行するときです。EBPでは、1つの event.uasset の中に、Wwiseプロジェクトで定義したすべてのプラットフォーム用に、そのEventのコンテンツが入っています。そして最も重要な情報は、Eventが必要とするSoundBankやメディアリソースのパスです。SoundBankにはメディアリソース自体はなく、EventやStructureのデータしか入っていないので、 event.uasset ファイルは大きさが数KBほどしかありません。メディアリソースのパスは、メディアリソースを探したりロードしたりするためのベースとなります。
media.uasset のコンテンツ
異なるEventから、同じオーディオファイルが参照されることがあります。よくあることで、リソースの冗長性につながりかねません。 event.uasset 間でサウンドファイルを共有できるように、すべてのメディアがSoundBankから取り除かれてデフォルトで、 ContentWwiseAudio\Media\ フォルダに別途保存されます。Wwise Authoringツールの整理方法でいくと、Eventが依存するAudio Soucreごとに media.uasset ファイルが用意されています。 event.uasset, media.uasset ファイルで説明したとおり、すべてのプラットフォームのコンテンツが1つのファイルにまとめて入っています。ユーザーが新しいプラットフォームを追加したとき、そのプラットフォームのメディアがファイルに追加されると、 media.uasset のファイルサイズは大きくなります。
メディアリソースはIDで指名されます。該当するMediaNameを探す場合は、UE4のContent Browserで Content\WwiseAudio\Media を開き、列に表示できます。
Wwiseリソースのロードプロセス
最も重要な2つのリソースであるevent.uassetとmedia.uassetの中身が理解できたところで、これらをロードする手順を見ていきます。 SoundBank とメディアは別々に保存されるので、リソースをロードするときは最初にSoundBankをロードし、続いてそれが参照するメディアをロードする必要があります。
Soundbankのロード
Wwiseでは、Eventが依存するSoundBankを、 PostEvent をコールする前にロードする必要がありますが、EBPの場合も同じです。 event.uasset をロードするときに、 SoundBank 、つまりすべてのEventやStructureが、自動的にロードされます。なお、EBPでは event.uasset がインスタンス化された時点で、 SoundBank はすでにメモリにロードされているので、そのロード済みSoundBankがある場所は、Wwiseが予約したメモリではなく、UE4の予約メモリであるということに注目してください。Sound Engineは、メモリアドレスを、SoundBankのロードを行う AK::SoundEngine::LoadBankMemoryView() 関数に対する引数として受け取ります。
必要なメディアのロード
SoundBankのロードが完了すると、 media.uasset がロードされます。ここではメディアを、 event.uasset に保存されたメディアリソースパスを通してロードします。そのためSoundBankと同じくUE4の予約済みメモリにあります。
EBPパイプラインでは、メディアをロードするのに PrepareEvent を使いません。代わりに SetMedia() 関数を通して、メディアリソースのメモリ場所をSoundEngineに提供するのです。どの media.uasset もインスタンス化されるのは1回だけなので、データが重複して読み込まれる心配はありません。
まとめ
このブログの目的は、EBPというアセット管理ワークフローで取り扱う主なリソースと、それをロードするプロセスを紹介し、新しいパイプラインを分かりやすく説明することでした。EBPパイプラインは比較的新しいので、今後のリリースに合わせて更新や改善が予想され、この記事の対象にも変化があるかもしれません。とはいえ、SoundBankの管理を自動化することで、ゲームオーディオの開発時間やコストが大幅に削減できると信じています。EBPがこれからさらに成熟して安定するにつれ、多くのゲーム開発チームの役に立つことと思います。
コメント