Skip to content

kamanii24/AssetBundleManager

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

63 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AssetBundleManager

Imgur

初期設定

AssetBundleManagerを使用するクラスに using を追加します。

using KM2;

AssetBundleManagerの初期化

AssetBundleManagerを使用する前には必ずInitializeメソッドをコールし、初期化を行う必要があります。

AssetBundleManifestとAssetBundleが同じ階層に存在する場合

Initializeメソッドの引数に、AssetBundleManifest(AssetBundleビルド時に生成されるプラットフォーム名が付いたファイル)のパスを指定します。

引数にManifestのパスのみを指定した場合、AssetBundleがManifestと同階層にあるとして処理されます。

一度設定すれば以降、設定する必要はありません。

AssetBundleManager.Initialize(manifestURL, (bool isComplete)=>
{
	// 初期化完了
});

AssetBundleManifestとAssetBundleが異なる階層に存在する場合

AssetBundleがManifestファイルと異なる階層に存在する場合は、引数としてassetBundleDirectoryURLを指定することができます。

こちらも一度設定すれば以降、値の変更しない限り設定し直す必要はありません。

AssetBundleManager.Initialize(manifestURL, assetBundleDirectoryURL, (bool isComplete)=>
{
	// 初期化完了
});

AssetBundleのダウンロード

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.");
    }
}

AssetBundleのロード

関数

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.");
    }
}

ロードしたAssetBundleからアセットを取得する

型指定なし

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本体

AssetBundle[] ab = AssetBundleManager.GetAllLoadedAssetBundles();

AssetBundle名

string[] abNames = AssetBundleManager.GetAllLoadedAssetBundleNames();

AssetBundleを破棄する

ロードしたAssetBundleは明示的に破棄するまでメモリに保持され続けるため、不要になったAssetBundleはUnloadで破棄する必要があります。

AssetBundleManager.Unload(true);    // trueにした場合、AssetBundleからロード済みのアセットも破棄されます

AssetBundle名を指定して個別に破棄することも可能です。

AssetBundleManager.Unload(true, bundleName);

ビルド環境

Unity 2018.4.8f1 macOS Mojave 10.14.6