Version: 2021.1
言語: 日本語
アセットを使ったスクリプティング
ストリーミングアセット

ランタイム時にリソースをロード

いくつかの状況では、プロジェクトにとってシーンの一部としてロードせずにアセットを使用可能とすることは便利です。例えば、ゲームのどのシーンでも登場できるキャラクターまたは別のオブジェクトがあるとして、あまり頻繁でないとします(これは “秘密” の機能、エラーメッセージ、またはハイスコアのお知らせ、でもよいです)。さらに初期のダウンロード時間を短縮するか、相互変更が可能とするため、ゲームコンテンツアセットを別のファイルまたは URL からロードしたいかもしれません。

Unity はプロジェクトで Resource フォルダー をサポートしており、コンテンツがメインのゲームファイルで供給されていても、リクエストがあるまでロードしない可能性があります。また、アセットバンドル を作成することもできます。これらのファイルはメインのゲームファイルから完全に分けられて、あるファイルまたは URL からゲームからオンデマンドでアクセスできるアセットを含みます。

アセットバンドル

アセットバンドルは外部アセットの集合です。複数のアセットバンドル、つまりは多くの異なる外部アセットの集合を保持することは可能です。これらのファイルはビルドされた Unity プレイヤーの外に存在するため、通常は Web サーバー上にあり、動的にエンドユーザーがアクセスできます。

アセットバンドルをビルドするためには、エディタースクリプトの中から BuildPipeline.BuildAssetBundles() をコールします。引数の中に、ビルドに含める オブジェクト の配列を、他のオプションとともに指定します。これにより後でランタイム時に AssetBundle.LoadAsset() を使用して動的ロードできるファイルを作成できます。

リソースフォルダー

リソースフォルダーはビルドされた Unity Player アセットの集合で、必ずしもインスペクター上でどれかのゲームオブジェクトにリンクされているわけではありません。

リソースフォルダーに何か入れるときは、単に プロジェクトビュー に新規フォルダーを作成し、フォルダーの名前を Resources とします。複数のリソースフォルダーをプロジェクトの中に異なる形で配置することができます。このフォルダーのどれかからアセットをロードしたいとき、Resources.Load() をコールします。

注意:

Resources フォルダーで見つかるすべてのアセットとその依存関係は resources.assets というファイルに格納されます。もしアセットがすでに別のレベルで使用される場合、そのレベルの .sharedAssets に格納されます。 Edit -> PlayerSettingsFirst Streamed Level 設定により resources.assets が集められてビルドに含めるレベルを決定します。

もし “最初にストリーミングしたレベル” がリソースフォルダーのアセットを含む場合、アセットはそのレベルのアセットとして格納されます。もし後から含めた場合、そのレベルは “resources.assets” からのアセットを参照します。

Resources フォルダー にあるアセットのみが Resources.Load() によりアクセスできます。しかし依存関係があるため、より多くのアセットが “resources.assets” ファイルに含まれるかもしれません(例えばリソースフォルダーのマテリアルは Resources フォルダーの外のテクスチャを参照しているかもしれません)。

リソースのアンロード

アセットバンドルのリソースをアンロードするには、AssetBundle.Unload() または AssetBundle.UnloadAsync(bool) を呼び出します。unloadAllLoadedObjects パラメーターに true を渡すと、アセットバンドルが内部に保存しているオブジェクトと、AssetBundle.LoadAsset() を使ってアセットバンドルからロードされたオブジェクトの両方が破棄され、バンドルが使用していたメモリが解放されます。

ときどきアセットバンドルをロードしたほうがよい場合があり、選んだオブジェクトをインスタンス化して、オブジェクトを残しつつバンドルが使用しているメモリを解放したいかもしれません。長所は他のタスク、例えば別のアセットバンドルをロードする等、のためにメモリを解放します。このシナリオでは false をパラメーターとして渡します。バンドルが破棄された後は、そこからオブジェクトをロードできなくなります。

もし別のレベルをロードする前に、Resources.Load() を使用してロードしたシーンのオブジェクトを破棄したい場合、Object.Destroy() を呼び出します。アセットを解放するためには Resources.UnloadUnusedAssets() を使用します。

アセットを使ったスクリプティング
ストリーミングアセット