Addressable Assetsを導入してみた

# はじめに
Unity 2018.2からAddressable Assetが利用できるようになりました。
今までのResourcesやAsset Bundleに替わるものとなりそうなので、試してみたいと思います。

# 使用したバージョン
Unity 2018.2.3f1
Addressables System 0.2.2 - preview

# 導入方法
Addressable AssetsはPackage Managerで管理されています。
しかし、現時点ではPackage一覧で表示されていないため、設定ファイルを以下のように変更する必要があります。

```json:Packages/manifest.json
{
  "dependencies": {
    "com.unity.addressables": "0.2.2-preview",
    // 元々記載されているパッケージ
  }
}
```

現状では最新バージョンが0.2.2 - previewでした。

Unity上でPackagesにAddressables Systemが追加されていればOKです。
Package Managerにも表示されるようになります。

![package-manager.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/aecd04d1-f515-6be4-ab22-15318efa75c9.jpeg)

Addressables Systemが表示されていればPackage Managerからバージョンアップすることもできます。
これでAddresable Assetsを利用する準備ができました。

# 基本的な利用方法

### アセットを準備する
まずは、登録するアセットを用意します。
今回はいらすとやさんのものを用意しました。

![textures.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/068fd084-b166-8450-d040-e141a0614702.jpeg)

### Addressable Settingsを作成する
続いて、Addressable Settingsを作成します。
メニューバーより`Window > Asset Management > Addresable Assets`を選択し、Addressablesウィンドウを表示します。
ウィンドウ内の`Create Addressables Settings`ボタンから作成します。

![addressable-assets.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/d0c21413-dc2b-e20d-777a-8472527d2b50.jpeg)

ボタンを押すと`Assets/AddressableAssetsData/AddressableAssetSettings.asset`が作成されます。
また、先程までのAddressablesウィンドウの表示内容が変わります。

![addressable-asset-settings.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/dc8740b7-f087-76c4-45a7-1e0f34894c00.jpeg)![addressable-assets2.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/3b9a5cb7-37ba-4872-1d5a-f1ab936a2958.jpeg)

### アセットを登録する
Addressablesウィンドウの`Default Local Group`にアセットを登録します。
フォルダをD&Dすることもできますが、フォルダ内のアセットは登録されずグレーアウトされた状態になってしまい、正しく登録することができません。
そのため、ファイル自体を登録するようにします。

![addressable-assets3.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/8d20cb20-cfee-78b9-aec2-0449e8694ad7.jpeg)

これで利用する準備ができました。

### アセットを読み込む
シーンにImageを配置してスクリプトで読み込んだアセットを表示してみます。
以下のスクリプトを作成し、ImageのGameObjectに貼り付けます。
Imageの参照も設定しておきます。

```cs:LoadSprite.cs
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;

public class LoadSprite : MonoBehaviour
{
    [SerializeField] private Image _image = null;

    private void Start()
    {
        Addressables.LoadAsset<Sprite>("Assets/Textures/icon_medical/icon_medical_man01.png").Completed +=
            op => _image.sprite = op.Result;
    }
}
```

`Addressable.LoadAsset`で登録したアセットを読み込むことができます。
指定する文字列は`Asset Address`の項目のものを指定します。
読み込みはすぐに完了するとは限らないため、読み込み完了時の処理をコールバックで行っています。

実行すると参照を設定したImageに文字列で指定したSpriteが表示されているはずです。
表示されていない場合はAsset Addressなどを再度ご確認ください。

インスペクターから読み込むアセットを指定できる方法もあります。

```cs:LoadSprite2.cs
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;

public class LoadSprite : MonoBehaviour
{
    [AssetReferenceTypeRestriction(typeof(Texture2D))]
    public AssetReference AssetReference;

    [SerializeField] private Image _image = null;

    private void Start()
    {
        Addressables.LoadAsset<Sprite>(AssetReference).Completed +=
            op => _image.sprite = op.Result;
    }
}
```

`AssetReference`はインスペクター上でAddressablesウィンドウで登録したアセットを選択することができます。
`AssetReferenceTypeRestriction`アトリビュートを利用することで選択候補に表示されるアセットを制御できます。
しかし、publicなAssetReferenceにしか効果が発生しませんでした。
（privateにして`SerializeField`アトリビュートを利用していた場合は、選択候補に表示されるアセットが制御できませんでした。）
またSpriteを指定すると正しく動作しなかったため、Texture2Dを指定して選択候補を制御しています。

こちらも実行すると参照を設定したImageにAssetReferenceで指定したSpriteが表示されているはずです。

# まとめ
* Addressable AssetsはPackage Managerで管理されている。
* 初期状態ではPackage Managerに表示されていないため、`Packages/manifest.json`を編集する。
* 利用するアセットはAddressablesウィンドウで登録する。
* アセットは`Addressables.LoadAsset`で読み込み、読み込み後の処理は`Completed`コールバックで行える。
* 読み込み時のファイル指定は、Asset Addressの文字列かAssetReferenceで行える。

Addressable Assetsが利用できる状態になったと思いますので、一旦ここでこの記事は終わります。
次の記事ではAssetBundleを作成部分などを書きたいと思います。

# 参考URL
[Addressable Assets Systemを完全に理解する - Qiita](https://qiita.com/k7a/items/b4fd298bcb64dc968ad1)