AssetBundleManagerを使用するクラスに using を追加します。
using KM2;
AssetBundleManagerを使用する前には必ずInitializeメソッドをコールし、初期化を行う必要があります。
Initializeメソッドの引数に、AssetBundleManifest(AssetBundleビルド時に生成されるプラットフォーム名が付いたファイル)のパスを指定します。
引数にManifestのパスのみを指定した場合、AssetBundleがManifestと同階層にあるとして処理されます。
一度設定すれば以降、設定する必要はありません。
AssetBundleManager.Initialize(manifestURL, (bool isComplete)=>
{
// 初期化完了
});
AssetBundleがManifestファイルと異なる階層に存在する場合は、引数としてassetBundleDirectoryURLを指定することができます。
こちらも一度設定すれば以降、値の変更しない限り設定し直す必要はありません。
AssetBundleManager.Initialize(manifestURL, assetBundleDirectoryURL, (bool isComplete)=>
{
// 初期化完了
});
UnityWebRequest によるGET通信で AssetBundleManager.Initialize で指定したリモートディレクトリから downloadAssetBundles 指定したAssetBundleをダウンロードします。
コールバック引数でダウンロード対象のAssetBundleのファイルサイズを受け取れるので、進捗値をディスプレイすることが可能です(実装は下記参照)。
private void Start()
{
string[] downloadAssetBundles = { bundle_1, bundle_2, bundle_3 };
AssetBundleManager.DownloadAssetBundle(downloadAssetBundles, Downloading);
}
// ダウンロード更新
private void Downloading(ulong downloadedBytes, ulong totalBytes, int fileIndex, bool isComplete, string error)
{
// ダウンロードBytesサイズ更新
print(downloadedBytes + " bytes / "+ totalBytes + "bytes");
// ダウンロード完了
if (isComplete)
{
print("Donwload completed.");
}
}
LoadAssetBundle(string loadAssetBundle, AssetBundleLoaded handler);
LoadAssetBundle(string[] loadAssetBundles, AssetBundleLoaded handler);
AssetBundleLoaded(AssetBundle[] loadedAssetBundles, string error);
ロードの完了通知はコールバックデリゲートで受け取れます。 loadAssetBundles で指定したAssetBundleがキャッシュ内に存在しない場合は、ダウンロードします。 DownloadAssetBundleとの違いは、delegateで完了通知だけを受け取ることができるので、ダウンロードのプログレス更新が不要な場合や解放されているAssetBundleを個別にロードする場合に使用されます。
private void Start()
{
string[] loadAssetBundles = { bundle_1, bundle_2, bundle_3 };
AssetBundleManager.LoadAssetBundle(loadAssetBundles, Loaded);
}
// AssetBundleのロード完了
private void Loaded(AssetBundle[] assetBundles, string error)
{
if(error != null)
{
foreach(var ab in assetBundles) print(ab.name + " is loaded.");
}
}
型指定なし
Object obj = AssetBundleManager.GetAsset (bundleName, assetName);
ジェネリック型指定
AudioClip clip = AssetBundleManager.GetAsset<AudioClip> (bundleName, assetName);
非同期 ジェネリック型指定
GetAssetAsync<GameObject> (bundleName, assetName, (GameObject go) => {
if (go != null) {
Instantiate (go, Vector3.zero, Quaternion.identity);
}
});
AssetBundle本体
AssetBundle[] ab = AssetBundleManager.GetAllLoadedAssetBundles();
AssetBundle名
string[] abNames = AssetBundleManager.GetAllLoadedAssetBundleNames();
ロードしたAssetBundleは明示的に破棄するまでメモリに保持され続けるため、不要になったAssetBundleはUnloadで破棄する必要があります。
AssetBundleManager.Unload(true); // trueにした場合、AssetBundleからロード済みのアセットも破棄されます
AssetBundle名を指定して個別に破棄することも可能です。
AssetBundleManager.Unload(true, bundleName);
Unity 2018.4.8f1 macOS Mojave 10.14.6