sunagimoブログ

主にUnityに関する技術を取り上げます

【Unity】Addresable Asset Systemを使ってみる

本記事で扱うUnityのバージョンは「Unity2018.3.7f1」です。
Addresable Asset Systemのバージョンは「Version 0.6.7 Preview」です。



Addresable Asset Systemについて


今までの複雑だったAssetBundleのビルドやロードをよりシンプルにしたAsset管理システム

とにかくコードを書く量が少なく済み、環境によって書き換えたり、依存関係を気にすることがなくなる



使い方


導入編

まだPreview版なので、Unity2018.2以降のPackageManagerよりインストール可能です。

f:id:sunagimo_app:20190313024929p:plain


インストール後、UnityのWindow→Asset Management→Addresable Assetsを開きます。

f:id:sunagimo_app:20190313025051p:plain


はじめは設定が必要なので、
Create Addresables Settingを選択して、
設定ファイルを作成します。
f:id:sunagimo_app:20190313030709p:plain


作成後、このようなウインドウが開かれます。

f:id:sunagimo_app:20190313025138p:plain

ここで主にAssetを管理します。


Assetの登録

登録したいAssetをそのままAddresablesのウインドウに、ドラッグアンドドロップするか、
AssetのInspectorのAddresableにチェックを入れると登録されます。


Assetを選択してドラッグアンドドロップ
f:id:sunagimo_app:20190313025633p:plain


もしくはチェックマークを入れる
f:id:sunagimo_app:20190313025715p:plain


登録されるとこのようになります。
f:id:sunagimo_app:20190313025753p:plain



Addresableで使用するAsset名が長いのでシンプルにします。
f:id:sunagimo_app:20190313025828p:plain

対象のAssetを選択して、Simplify Entry Namesを選択。


Addresableで管理したいディレクトリを丸ごと持ってくるということは現状ではできないので、
今後追加されることを祈るか、自前で実装という感じですね。


一応これで準備は整いました。


Addresableのモード


Addresableの動作モードを説明します。
f:id:sunagimo_app:20190313030338p:plain


Play Mode Scriptを選択すると、各モードが選択できます。


・Fast
パッキングせずに、ファイルを直接ロード
・Virtual
パッキングせずに、実際にパッキングしたときの動作をシミュレート
・Packed
パッキングして、AssetBundleからロード


Assetの読み込み


実際にコードを書いていきます。

 Addressables.LoadAsset<Sprite>(assetName)
       .Completed += (op) => {
             img.sprite = op.Result;
       };


非同期で読み込みます。
渡す引数としては、「Asset名(assetName)」の他に、
「AssetReference」というのも渡せます。

こちらは、Addresableの対象となっているAssetを直接選択することで、
入力する手間やミスを防ぐことができます。


※ver0.6.6以降から
AssetReferenceTypeRestrictionのアトリビュートを指定して、
アセットのタイプを指定できたのですが、
いろいろ変更があったらしく、処理自体が消えました。

f:id:sunagimo_app:20190313032140p:plain


docs.unity3d.com



ver0.6のAPIReferenceも消えているので、今後どうなるのかわかりませんが、
おそらくそれぞれの指定できるTypeのAssetReferenceを呼ぶ必要があるのかと。

f:id:sunagimo_app:20190313032601p:plain



    [Header("Asset参照(Sprite)")]
    [SerializeField]
    private AssetReferenceSprite assetReference = null;

    /// <summary>
    /// 参照読み込み。
    /// </summary>
    void ReferenceLoad()
    {
        Addressables.LoadAsset<Sprite>(assetReference)
                    .Completed += (op) => {
                        img.sprite = op.Result;
                    };
    }


こんな感じでInspectorから指定できます。
f:id:sunagimo_app:20190313032944p:plain


Assetの解放

Addresables.ReleaseAssetで参照したAssetの解放が行えます。

    /// <summary>
    /// アセットリスト。
    /// </summary>
    List<Sprite> assetList = new List<Sprite>();

    [Header("Asset参照(Sprite)")]
    [SerializeField]
    private AssetReferenceSprite referenceSprite = null;
    
    /// <summary>
    /// 参照読み込み。
    /// </summary>
    void ReferenceLoad()
    {
        if(referenceSprite == null)
        {
            return;
        }

        Addressables.LoadAsset<Sprite>(referenceSprite)
                    .Completed += (op) => {
                        img.sprite = op.Result;
                        assetList.Add(op.Result);
                    };
    }

    /// <summary>
    /// 全ての参照を解放。
    /// </summary>
    void AllReleaseAsset()
    {
        for(var i = 0; i < assetList.Count; ++i)
        {
            Addressables.ReleaseAsset(assetList[i]);
        }
    }


参照しているAssetの情報などはAddresable Profilerより確認できます。

f:id:sunagimo_app:20190313033434p:plain

f:id:sunagimo_app:20190313033459p:plain


実際に読み込むとグラフとして表示され、下にログも残ります。
f:id:sunagimo_app:20190313033531p:plain


解放すると参照が消えて、色が薄くなります。
f:id:sunagimo_app:20190313033700p:plain



まとめ


今までのAssetBundleのシステムと比べるととてもシンプルになりました。
Profilerなども用意してあり、一々ログを仕込まなくてもよくなりました。

まだPreviewということなので、今後も変更があるとは思いますが、
よりよい変更になることを期待してます。


今回のプロジェクト


github.com





参考にさせていただいたサイト様


qiita.com
qiita.com
kan-kikuchi.hatenablog.com