AssetBundle (アセットバンドル) を使用するには、以下の手順で行います。各手順に関する詳細情報は、本セクションの他のページを参照してください。
ノート: このセクションでは、ビルトインの BuildPipeline.BuildAssetBundles() API を使用してアセットバンドルを作成する方法について説明します。推奨するよりユーザーフレンドリーな方法は、Addressables パッケージを使用する方法です。
AssetBundle (アセットバンドル) へのアセットの割り当ては、以下の手順で行います。
/
で区切ります。例えば、environment/forest
というアセットバンドル名は、environment
というサブフォルダー配下に forest
という名前のバンドルを作成します。ノート: Inspector で、プロジェクト内のフォルダーにアセットバンドルを割り当てることができます。デフォルトでは、そのフォルダー内のすべてのアセットが、同じアセットバンドルにフォルダーで割り当てられます。ただし、個々のアセットに対するアセットバンドルの割り当てが優先されます。
アセットバンドルを割り当てる上での各種方法についての詳細は、このドキュメンテーションの アセットバンドル用のアセットの準備 のページを参照してください。 。
Assets フォルダー内に Editor という名前のフォルダーを作成し、そのフォルダー内に、以下のスクリプトを置いてください。
using UnityEditor;
using System.IO;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None,
BuildTarget.StandaloneWindows);
}
}
このスクリプトは、 アセット メニューの下部に Build AssetBundles というメニュー項目を作成し、そのタグに関連付けられた関数のコードを実行します 。 Build AssetBundles をクリックすると、プログレスバーがビルドダイアログとともに表示されます。これにより、AssetBundle 名でラベル付けしたすべてのアセットを取得し、assetBundleDirectory
が定義するパスのフォルダーに置きます。
ノート: 上記で説明した Inspector ベースの方法を使用する代わりに、AssetBundlesのコンテンツをプログラムで定義することもできます。これは、AssetBundleBuild 構造体の配列を受け取る BuildPipeline.BuildAssetBundles のシグネチャを使用することで可能です。その場合、各バンドルのアセットのリストが渡され、Inspector で行われる AssetBundles への割り当ては無視されます。
詳細は、上の アセットバンドルをビルドする を参照してください。
ローカル ストレージからロードしたい場合は、以下のように AssetBundles.LoadFromFile
APIを使用します。
public class LoadFromFileExample : MonoBehaviour {
void Start() {
var myLoadedAssetBundle
= AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
if (myLoadedAssetBundle == null) {
Debug.Log("Failed to load AssetBundle!");
return;
}
var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject");
Instantiate(prefab);
}
}
LoadFromFile
はバンドルファイルのパスを必要とします。
アセットバンドルがオンラインでホストされている場合、または直接的なファイルシステムアクセスをサポートしていないプラットフォームで実行されている場合は、UnityWebRequestAssetBundle
API を使用してください。以下はその例です。
IEnumerator InstantiateObject()
{
string url = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;
var request
= UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(url, 0);
yield return request.Send();
AssetBundle bundle = UnityEngine.Networking.DownloadHandlerAssetBundle.GetContent(request);
GameObject cube = bundle.LoadAsset<GameObject>("Cube");
GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
Instantiate(cube);
Instantiate(sprite);
}
GetAssetBundle(string, int)
はアセットバンドルの場所の URL およびダウンロードしたいバンドルのバージョンを必要とします。この例ではローカルファイルを指していますが、string url
はアセットバンドルがホスティングされている URL のどれでも指すことができます。
UnityWebRequestAssetBundle クラスにはアセットバンドルを処理するためのハンドル DownloadHandlerAssetBundle
があり、リクエストからアセットバンドルを取得します。
使用するメソッドに関わらず、これでアセットバンドルオブジェクトが利用可能になりました。そのオブジェクトから LoadAsset<T>(string)
を使用する必要があります。この LoadAsset<T>(string)
は、ロードしようとしているアセットのタイプ T
と、文字列 (string) としてバンドル内のオブジェクトの名前を必要とします。これは、アセットバンドルから読み込んでいるオブジェクトを、どんなものでも返します。この返されたオブジェクトは、Unity 上の他のオブジェクトと全く同じように使用できます。例えば、シーン内でゲームオブジェクトを作成したい場合は、単純に Instantiate(gameObjectFromAssetBundle)
を呼び出すだけで行うことができます。
アセットバンドルをロードする API に関する詳細は、Unity ドキュメンテーションの アセットバンドルを使いこなす を参照してください。