UE4 アセットマネージメントフレームワークについて
UE4.17からアセットマネージメントフレームワーク(Asset Management Framework)と呼ばれるものが正式版として利用可能になりました。この仕組みは必要のない人には全く不要の機能です。UE4のアセットのロードやアンロードは自動的に行われており、それらを細かく制御する必要がありませんでした。
ただし、コンソールゲーム開発やモバイルゲーム開発ではこのようなやり方をとっていると致命的な問題になってきます。メモリーが足りていない状況や、一気にアセットを読み込むと負荷が問題になるようなケースがありますが、このような場合にアセットマネージメントフレームワークを使うことで、より細かいアセットの読み込みが可能となります。
では早速アセットマネージメントフレームワークもとい、アセットマネージャーについて解説をしていきたいと思います。
基本用語
アセットマネージャーの仕組みを使う前に基本的な用語を理解しておく必要があります。
1. プライマリーアセットとセカンダリーアセット
プライマリーアセットとはアセットマネージャーを介して直接操作が可能なアセットのことです。プライマリーアセットIDを指定することによって、エンジン側に必要なアセットの読み込みを開始させることができます。
セカンダリーアセットはアセットマネージャー上で指定することはなく、プライマリーアセットに紐付くアセットとして自動的に読み込まれるアセットです。プライマリーアセットが参照を持っているアセットは自動的にセカンダリーアセットとして登録されます。
2. アセットマネージャーとストリームマネージャー
アセットマネージャーは名前の通り、アセットを管理するために用意されたシングルトンクラスです。またアセットマネージャー内部にはストリームマネージャーと呼ばれる仕組みがラップされているので、自動的に非同期的に読み込みを行うことが可能となっています。
3. アセットバンドル
某エンジンに搭載されている仕組みとは全く別のものです。アセットバンドルはプライマリーアセットに関連付いた、特定アセットの名前付きリストです。C++コード内でアセットバンドル自体の作成が可能となっていますが、これを意識する必要はほとんどの場合ありません。プライマリーアセットからセカンダリーアセットが自動的にアセットバンドルのリストとして登録されているくらいの認識でいいと思います。
プライマリーアセットを登録する
プライマリーアセットの登録する方法は2つあります。1つはプロジェクト設定の"Asset Manager"からプライマリーアセットタイプとして登録する方法です。もう1つはプライマリーデータアセットを作成し、そこにアセットを登録する方法です。
まずは前者の方法です。プロジェクト設定を開き、Asset Managerから"Primary Assset Types to Scan"で要素を追加します。
次に"Primary Asset Type"で名前を入力します。
ここの名前は非常に重要です。もし、この後の工程でうまく動かない場合にはここをまず疑ってください。そして"Asset Base Classs"を指定します。例えばスタティックメッシュのアセットなら"Static Mesh"、スケルタルメッシュのアセットなら"SkeletalMesh"を選択します。
更に"Directories"から要素を追加し、アセットの存在するフォルダーを選択します。このサブフォルダーも検索対象となります。
これで基本的には利用可能となりますが、次はブループリントの場合です。
ブループリントの場合も基本は同じですが、"Asset Base Class"で"Actor"を選択し、"Has Blueprint Classes"に必ずチェックをつけます。
今回はフォルダー指定せずに"Specific Assets"としてブループリントを直接登録してみます。
このような状態になっていれば問題ありません。
次はプライマリーデータアセットとして登録する方法です。まずは以下のようにデータアセットを作成します。
そしてデータアセットクラスの選択で、"PrimaryAssetLabel"を選択します。
プライマリーデータアセットを開くと、"Explicit Assets"からあらゆるアセットを登録することができます。またブループリントの場合には"Explicit Blueprints"からでも指定が可能です。配列要素となっているので、一度に大量のアセットを登録しておくことも可能です。
これでプライマリーアセットの登録が完了しました!次は実際にアセットを読み込みます。
プライマリーアセットを指定して読み込む
実際に読み込む作業はとても簡単です。ブループリントから"Async Load Primary Asset"を配置します。
"Primary Asset"ピンから実際にプライマリーアセットを指定します。ここで正しくプライマリーアセットが登録されていれば、アセットが一覧に表示されます。
もしここで上手く表示されない場合には、"Asset Manager"の設定で、"Primary Asset Type"の名前を変えてみたり、"Directories"の指定を変えてみたりしてください。特に名前の方はなぜか特定の名前を指定した場合には表示されないことが多いです。これが不具合なのか仕様なのかはわかりません。
上手くいけばアセットの読み込みが非同期的に開始され、完了すると"Completed"が呼び出されてます。これで自由にアセットを利用することが可能です。
更に"Async Load Primary Asset List"を使うと、一気に複数のプライマリーアセットを読み込むことができます。
当然ながら、全てのアセットの読み込みが完了するまではCompletedがこないので、単体で呼ぶよりも読み込みが長くなることには注意が必要です。
プライマリーアセットを指定して削除
当然読み込みができるのであれば、読み込んだアセットを削除することも可能です。
"Unload Primary Asset"でメモリー上に読み込んだアセットを削除します。こちらは非同期ではないので、一気に行う場合には注意が必要です。
使い方自体は非常に単純なので、特に難しいことはないはず。
Asset Audit(アセット監視)ウィンドウを使って一覧化する
最後にAsset Auditウィンドウというものを使ってプライマリーアセットなどを一覧で見てみましょう。Asset Auditウィンドウはメニューから"ウィンドウ"→"デベロッパーツール"→"Asset Audit"で表示します。
これでウィンドウが開いたので、実際にプライマリーアセットを表示してみましょう。
"Add Primary Asset Type"でプライマリーアセットを追加することができます。プライマリーアセット以外も追加可能です。
"Add Asset Class"からクラスを選択するか、個々のアセットをコンテンツブラウザーで右クリックして画像のように選択すると、追加されます。
Asset Auditウィンドウは実際に管理されているアセットの様々な情報を簡単に閲覧可能です。右下にある表示オプションから、表示したいカラム情報だけを選択すれば、自分が欲しい情報を見ることも可能です。
このように必要なアセットの情報だけを並べたりすることが可能です。PC版では"Selected Platform"は基本的に"Editor"のみですが、コンソールやモバイル用のアセットを別途登録しておくことも可能です。
様々な使い道があると思いますのでぜひ活用してください!