Skip to content

eral/AssetBundleShosha

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

82 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AssetBundleShosha

所謂オレオレAssetBundleManagerです。
アセットバンドル構築時から積極的に介入する事でマネージャーだけでは対応出来ない事も扱います。

出来る事

  • アセットバンドルの構築・配信・利用(バリアント・依存関係対応)
  • ストリーミングアセットの配信・利用(バリアント対応)
  • アセットバンドルの暗号化
  • ダウンロードサイズ取得
  • ダウンロード進捗取得
  • ネットワークエラー発生時のリトライ支援
  • アセットバンドルを作成する事無くエディタ上でアセットを提供するサーバーエミュレーション機能

使用方法

データ構築

  1. アセットバンドルはInspector下部のアセットバンドル欄にアセットバンドル名・バリアント名を設定する
    アセットバンドル名の設定
  2. 配信ストリーミングアセットはDeliveryStreamingAssetsディレクトリ以下に保存する
    配信ストリーミングアセットの設定
  3. Assets/AssetBundles/Build AssetBundles/」を実行する
    アセットバンドル構築
  4. AssetBundlesディレクトリ以下に配信データが生成される
    配信データ

データ参照

  1. 破棄されないGameObjectAssetBundleManagerコンポーネントを付加する
  2. アセットバンドルマネージャーコンポーネントを初期化する
    var baseURL = "http://127.0.0.1/AssetBundles/"; //データ構築で作成したファイル群が在るURL
    yield return AssetBundleManager.Instance.Initialize(baseURL);
  3. アセットバンドルはInspector下部のアセットバンドル欄に設定したアセットバンドル名でLoadAssetBundleする
    アセットバンドルのロード待ちやアセットの取得方法はUnity標準の使用方法と同様
    var assetBundle = AssetBundleManager.Instance.LoadAssetBundle("assetbundlesample");
    yield return assetBundle;
    var loadRequest = assetBundle.LoadAssetAsync<Texture>("Sample");
    yield return loadRequest;
    var texture = (Texture)loadRequest.asset;
    
    //アセットバンドルが不要になれば「Dispose()」を呼ぶ (Unload()では無いので注意)
    //取得したテクスチャ等はアセットバンドル破棄後も使用可能
    assetBundle.Dispose();
  4. 配信ストリーミングアセットはDeliveryStreamingAssetsディレクトリからの相対パス(拡張子無し)の手前にDeliveryStreamingAssets:を付けた名前でLoadAssetBundleする
    ロード後はdeliveryStreamingAssetPathにてファイルパスを取得する
    var deliveryStreamingAsset = AssetBundleManager.Instance.LoadAssetBundle("DeliveryStreamingAssets:StreamingFile");
    yield return deliveryStreamingAsset;
    var deliveryStreamingAssetPath = deliveryStreamingAsset.deliveryStreamingAssetPath;
    
    //配信ストリーミングアセットが不要になれば「Dispose()」を呼ぶ (Unload()では無いので注意)
    //取得したパスは配信ストリーミングアセット破棄後も使用可能
    deliveryStreamingAsset.Dispose();

特殊な使い方

暗号化

アセットバンドルの暗号化は基本的にデメリットしかないのでお勧めしません。
ファイル単位で暗号化するかしないかを設定出来る様にしているので最低限の暗号化で済む様に厳選した方が良いです。
配信ストリーミングアセットは暗号化出来ません。

  1. Assets/AssetBundles/Crypto/Create Crypto Key」を実行する
  2. Assets/AssetBundleShoshaUserData/ScriptsディレクトリにAssetBundleCryptoKeyスクリプトが作成される
  3. AssetBundleCryptoKeyスクリプトの中のAssetBundleCryptoPasswordプロパティに暗号化パスワードを設定する(文字長制限無し)
    private static string AssetBundleCryptoPassword {get{
        //Input Your Password!
        return @"XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXx";
    }}
    (文字列ではなくバイナリで指定したい場合はbyte[16]の値を返す様にAssetBundleCryptoKeyプロパティを書き換える)
  4. 暗号化したいアセットバンドルに「CryptoAssetBundle」ラベルを付ける
    暗号化アセットバンドル
    (全アセットバンドルを暗号化したい場合は「Assets/AssetBundles/Build AssetBundles/Options/Force Crypto」を有効にする)
  5. 通常通りデータ構築・データ参照する

ダウンロード進捗表示

AssetBundleShosha.IProgressReceiverを実装したコンポーネントを用意し、AssetBundleManagerコンポーネントのProgress Receiverに設定する

public class ProgressSample : MonoBehaviour, AssetBundleShosha.IProgressReceiver {
    public void ProgressStart() {
        //読み込みが始まると呼ばれる
    }
    public void ProgressUpdate(float progress) {
        //進捗が更新されると呼ばれる
    }
    public void ProgressFinished() {
        //読み込みが終わると呼ばれる
    }

    public void ProgressErrorStart() {
        //読み込み中にエラーが発生すると呼ばれる
    }
    public void ProgressErrorFinished() {
        //エラーが解消されると呼ばれる
    }
}

ネットワークエラー発生時のリトライ

AssetBundleShosha.IErrorHandlerを実装したコンポーネントを用意し、AssetBundleManagerコンポーネントのError Handlerに設定する

public class ErrorHandlingSample : MonoBehaviour, AssetBundleShosha.IErrorHandler {
    public void Error(AssetBundleShosha.IErrorHandle handle) {
        //エラーが発生すると呼ばれる
        //リトライするなら「handle.Retry()」、エラーを無視するなら「handle.Ignore()」を呼ぶ
        //翌フレームに持ち越してもOK
    }
}

一部の読み込みのみエラー処理を変えたい場合はLoadAssetBundleの戻り値にエラーハンドラーを設定する

public class ErrorHandlingSample2 : MonoBehaviour {
    protected virtual void Start() {
        var assetBundle = AssetBundleManager.Instance.LoadAssetBundle("...");
        assetBundle.errorHandler = new ErrorHandler();
    }
    private class ErrorHandler : AssetBundleShosha.IErrorHandler {
        public void Error(AssetBundleShosha.IErrorHandle handle) {
            //...
        }
    }
}

エディタ上に於いてアセットバンドルを作成せずにデータを参照

  1. Assets/AssetBundles/Server Emulation」をLoad Assets Directに設定する
  2. 通常通りデータ参照する

注意事項

アンロード

アンロードは必要ありません。
アセットバンドルはガベージコレクション対象ですので、参照が無くなればいずれアンロードされます。
即時にアンロードしたい場合はDisposeすれば良いです。

多重読み込み

同じアセットバンドルを複数ロードしてもalready loadedエラーは発生しません。
内部で良しなに取り回します。
多重読み込みしている場合に即時アンロードを行うには重複している全てのアセットバンドルがDisposeされる必要があります。

データ更新

データが更新されたかを検知する方法は現在のところありません。
データが更新された場合は目録を読み直さなければいけない為、Initializeを呼ぶ必要があります。
Initializeを超えて保持し続けたアセットバンドルにアクセスした場合、ObjectDisposedExceptionが投げられる予定です。

異なるプラットフォームの同居

Unity標準機能と違いプラットフォーム名でディレクトリを作成しませんが、代わりに1ディレクトリに全てのプラットフォームを同居出来ます。
配信ストリーミングアセットが在る場合に異なるプラットフォームのデータを同居させようとすると同名ファイルに当たりますが、被るファイルは全て同一ファイルですので上書いても支障はありません。

LICENSE

Boost Software License, Version 1.0

About

アセットバンドル商社

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages