- AssetBundleのダウンロード・差分更新
- AssetBundleビルド時に圧縮形式の選択(LZMA, LZ4, 非圧縮)
- AESによるAssetBundleの暗号化・復号化
AssetBundleに関する必要な処理をまとめたサンプルプロジェクトです。
DownloadScene、AssetBundleSceneの2シーン構造です。
DownloadSceneでサーバからAssetBundleをダウンロード後、AssetBundleSceneで取得したアセットを表示します。
※サンプルでダウンロードするAssetBundleにユニティちゃんアセットを使用しています。
初回にInitializeをコールし、AssetBundleが含まれるサーバ上のディレクトリとAssetBundleのバージョンを指定します。 バージョン指定は任意です。 一度設定すれば以降、値の変更しない限り設定する必要はありません。
AssetBundleManager.Initialize (bundleDirURL, 1);
DownloadAssetBundleでダウンロードするAssetBundle名を指定します。
コールバックデリゲートでダウンロードの進捗値を取得できます。
string[] bundleNames = { bundle_1, bundle_2, bundle_3 };
AssetBundleManager.DownloadAssetBundle (bundleNames, ((float progress, int fileIndex, bool isComplete, string error) => {
// エラー処理
if (error != null) {
Debug.Log("ダウンロードエラー");
}
// 進捗処理
else if (isComplete) {
Debug.Log("ダウンロード完了");
}
else {
int per = (int)(progress*100f);
Debug.Log(per+"%");
Debug.LoG(fileIndex + "/" + bundleNames.Length);
}
}));
LoadAssetBundleでロードするAssetBundle名を指定します。
ロードの完了通知はコールバックデリゲートで受け取れます。
string[] bundleNames = { bundle_1, bundle_2 };
AssetBundleManager.LoadAssetBundle (bundleNames, ((bool isSuccess, string error) => {
if (isSuccess) {
Debug.Log("ロード成功");
}
else {
Debug.Log("ロード失敗 : "+error);
}
}));
ロードしたAssetBundleから必要なアセットを取得するにはGetAssetに取得したいアセット名と、それが含まれるAssetBundle名をしていします。
取得したアセットはObject型なので適当な型にキャストします。
型指定なし
Object obj = AssetBundleManager.GetAsset (bundleName, assetName);
ジェネリック型指定
AudioClip clip = AssetBundleManager.GetAsset<AudioClip> (bundleName, assetName);
非同期
GetAssetAsync (bundleName, assetName, ((Object asset, bool isSuccess) => {
if (isSuccess) {
Instantiate ((GameObject)asset, Vector3.zero, Quaternion.identity);
}
}));
GetAllAssetBundleNameで現在ロードされているAssetBundleをstring配列で全て取得できます。
string[] bundles = GetAllAssetBundleName();
ロードしたAssetBundleは明示的に破棄するまでメモリに保持され続けるため、不要になったAssetBundleはUnloadで破棄する必要があります。
AssetBundleManager.Unload();
AssetBundle名を指定して個別に破棄することも可能です。
AssetBundleManager.Unload(bundleName);
Unityのメニューバー AssetBundles/Open Config を選択し、暗号化のためのキー文字列を設定します。
Saltは8文字以上である必要があります。
キー文字列の設定後、AssetBundles/Enable AES Cryption にチェックをつけて Build AssetBundles でビルドします。
暗号化されたAssetBundleもダウンロード時に自動的に復号され、通常のAssetBundleと同等に扱うことができます。
- エディタメニューのEnable AES Cryptionのチェックがビルドをする度に外れる問題を修正
- AESによるAssetBundleの暗号化機能の追加
- Unity2017.1以降のバージョンでCaching.ClearAllCachedVersionsを追加
- AssetBundleManagerをstaticクラスへ変更
前回のバージョンから使用されていた場合はInstanceを外してください。
-
AssetBundleのダウンロード処理をWWWからUnityWebRequestへ変更
-
Initializeのバージョンを任意指定へ変更
指定しない場合のバージョンはデフォルトで 1 です。 -
AssetBundleビルド時に圧縮方法をメニューに追加
Build AssetbundlesにLZMA、LZ4、UnCompress(非圧縮)の3項目を追加しました。
- Unity2017対応
errorチェック処理をIsNullOrEmptyでの判定に変更。
-
GetAssetの戻り値をジェネリック型で指定できるオーバーロードメソッドの追加
GetAssetで取得できるオブジェクトを型指定できるようになりました。
取得したオブジェクトを各型にキャストする必要がなくなります。 -
型指定なしのGetAssetの戻り値をUnityEngine.Objectへ変更
-
オーバーロードメソッドの追加
DonwloadAssetBundleとLoadAssetBundleに配列ではないstring変数として引数に渡すことができるオーバーロードメソッドを追加しました。
これにより単一のAssetBundleの読み込みがより効率化します。 -
初期化チェック
AssetBundleManagerのメソッドをコールしたタイミングで初期化チェックが行われるようになりました。 初期化が行われずに各メソッドが実行された場合は警告がコンソールに出力されます。
- CRCを照合して更新されたAssetBundleのみをダウンロードされる機能の追加
AssetBundleのビルド時に生成される.manifestファイルをAssetBundle本体と併せて同ディレクトリに置くことで、AssetBundleのダウンロード実行時に更新されたAssetBundleのみをダウンロードされるように改修しました。
指定ディレクトリに.manifestファイルがない場合は以前の通りCRCの照合なしで実行されます。
Unity 2017.3.0p3
macOS High Sierra 10.13.3
本リポジトリには、UnityChanがAssetsとして含まれています。 以下のライセンスに従います。
このアセットは、『ユニティちゃんライセンス』で提供されています。このアセットをご利用される場合は、『キャラクター利用のガイドライン』も併せてご確認ください。