いくつかの状況では,プロジェクトにとってシーンの一部としてロードせずにアセットを使用可能とすることは便利です。例えば,ゲームのどのシーンでも登場できるキャラクターまたは別のオブジェクトがあるとして,あまり頻繁でないとします(これは “秘密” の機能,エラーメッセージ,またはハイスコアのお知らせ,でも良いです)。さらに初期のダウンロード時間を短縮するか,相互変更が可能とするため,ゲームコンテンツアセットを別のファイルまたはURLからロードしたいかもしれません。
Unityはプロジェクトで Resource Folders をサポートして,コンテンツがメインのゲームファイルで供給されるが,リクエストあるまでロードしないかもしれません。Unity Pro,Unity iOS Advanced,およびUnity Android Advancedでは, Asset Bundles を作成することもできます。これらのファイルはメインのゲームファイルから完全に分けられて,あるファイルまたはURLからゲームからオンデマンドでアクセスできるアセットを含みます。
アセットバンドルは外部アセットの集合です。複数のアセットバンドル,つまりは多くの異なる外部アセットの集合をを保持することは可能です。これらのファイルはビルドされたUnityプレイヤーの外に存在するため,通常はウェブサーバ上にあり,動的にエンドユーザがアクセスできます。
アセットバンドルをビルドするためには,エディタースクリプトの中から BuildPipeline.BuildAssetBundle() をコールします。引数の中に,ビルドに含める Objects 配列を,他のオプションとともに指定します。これにより後でランタイム時に AssetBundle.Load() を使用して動的ロードできるファイルを作成できます。
リソースフォルダはビルドされたUnity Playerアセットの集合で,必ずしもインスペクタ上でどれかのゲームオブジェクトにリンクされているわけではありません。
リソースフォルダに何か入れるときは,単に Project View に新規フォルダを作成し,フォルダの名前を “Resources” とします。複数のリソースフォルダをプロジェクトの中に異なる形で配置することが出来ます。このフォルダのどれかからアセットをロードしたいとき, Resources.Load() をコールします。
もしデプロイするターゲットは Streaming Web Player の場合,シーンのすべてをリソースフォルダに含めて定義することが出来ます。これを Player Settings の で行うことが出来ます。ストリーミングのキューはBuild Settingのscene orderで決定されます。
Resourcesフォルダで見つかる全てのアセットとその依存関係は resources.assets というファイルに格納されます。もしアセットがすでに別のレベルで使用される場合,そのレベルの .sharedAssets に格納されます。
設定により resources.assets が集められてビルドに含めるレベルを決定します。もし “最初にストリーミングしたレベル” はリソースフォルダのアセットを含む場合,アセットはそのレベルのアセットとして格納されます。もし後から含めた場合,そのレベルは “resources.assets” からのアセットを参照します。
Resources folder にあるアセットのみが Resources.Load によりアクセスできます。しかし依存関係があるため,より多くのアセットが “resources.assets” ファイルに含まれるかもしれません(例えばリソースフォルダのマテリアルはResourcesフォルダの外のテクスチャを参照しているかもしれません)。
アセットバンドルのリソースをアンロードするには AssetBundle.Unload() をコールします。もし unloadAllLoadedObjects に true を渡すと,アセットバンドルにより内部的に保持されたオブジェクトおよび AssetBundle.Load() をコールしてアセットバンドルからロードされたものは破棄されて,バンドルが使用していたメモリが解放されます。
ときどきアセットバンドルをロードしたほうが良い場合があり,選んだオブジェクトをインスタンス化して,オブジェクトを残しつつバンドルが使用しているメモリを解放したいかもしれません。長所は他のタスク,例えば別のアセットバンドルをロードする等,のためにメモリを解放します。このシナリオでは false をパラメータとして渡します。バンドルが破棄された後は,そこからオブジェクトをロード出来なくなります。
もし別のレベルをロードする前に, Resources.Load() を使用してロードしたシーンのオブジェクトを破棄したい場合, Object.Destroy() をコールします。アセットを解放するためには Resources.UnloadUnusedAssets() を使用します。