Addressable Asset System を試してみました。

#Addressable Asset System Packageを導入する

以前AssetBundleを使用してた時はビルドとか色々大変だった気がします。。。
Addressable Asset SystemはこのAssetBundle周りを簡単にしてくれるみたいです。

**環境**
今回使用したバージョンはUnity2019.2.0f1 で Address Asset Systemのバージョンは1.1.5になります。

**セットアップ**
Package ManagerでAddressablesを選択し、インストールします。
![スクリーンショット 2019-07-29 12.31.40(3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/e739c41c-318d-3ef4-2606-c006d2823389.png)

セットアップが完了すると,メニューにWindows>Asset Managementが作られます。
![スクリーンショット 2019-08-02 16.39.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/9c2e95b4-65d3-4172-485c-dad020b0a589.png)


Windows>Asset Management>Addressablesを選択して,Create Addressables Settingsを選択
環境を作成します。
![スクリーンショット 2019-07-29 12.31.40(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/66bc095b-4d17-d396-17d2-3f87dfecfa66.png)

デフォルトの環境が作成されます。
<img width="579" alt="スクリーンショット 2019-08-02 17.04.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/784994cc-0c57-fa53-0fe2-5786837418f3.png">


##ローカルでAssetを読みむ
まず、試しにローカルでの読み込みを行います。
新しいシーンを作成し、sphereをシーンに追加し、それをフォルダにドラッグしてprefabにします。
そしてAddressablesパネルのDefault Local Groupにドラッグします。
デフォルトだとpathがAsset Addressの名前になるので *Simplify Entry Names*で簡単な名前にします。

![スクリーンショット 2019-07-29 13.39.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/a793939d-15b7-9a47-c564-64bb7e0685e8.png)

下記のスクリプトをGameObjectをAttachしてください。
*AttachしたあとInspectorで読み込みしたいAssetRerenceに設定してください。*

```
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using System.Collections;

public class SampleAddress: MonoBehaviour
{
    public AssetReference Ref;
    GameObject Obj = null;
    AsyncOperationHandle<GameObject> loader;
    private void Start()
    {
        Addressables.LoadAsset<GameObject>(Ref).Completed+=OnLoadDone;
    }

    void OnLoadDone(AsyncOperationHandle<GameObject> handle)
    {
        loader = handle;
        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            Obj = handle.Result;
            Obj = Instantiate(Obj, transform.position, Quaternion.identity);
        }
    }
}
```
次にPlay Mode Scriptを設定します。
これはUnityでPlayする時のAddressableのモードを設定することが可能で

- Fast Mode / ビルド必要なし、ローカルAssetを直接読み込む
- Virtual Mode / ビルド必要なし、バーチャルHostを立てて、読み込みをシュミレートする
- Packed Play Mode /ビルド必要で、実際に指定したサーバーからロードする

![スクリーンショット 2019-07-29 14.42.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/c3254af7-baa9-33a2-8f0b-5c734b7137a1.png)

ローカルなのでFast Modeを選択し、Playすると設定したPrefabが読み込まれ、Instantiateされます。


##サーバーからAssetを読み込む

まず、シーンにCubeを追加してこれをPrefabにします。（サーバー読み込み用）
次にDefault Local Groupの他にグループを作成します。
<img width="601" alt="スクリーンショット 2019-08-03 00.53.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/33be1da3-5a70-3d46-4d7c-885df00bca2f.png">

作成したCube Prefabを新しく作成したPacked Asset Groupにドラッグします。
<img width="463" alt="スクリーンショット 2019-08-03 01.00.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/cf32bac3-692a-ca7d-96cd-06e846e79cdb.png">

**サーバー設定を行います。**
現在使用してるDefault Profile の設置を変更します。
<img width="352" alt="スクリーンショット 2019-08-03 01.25.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/f26ec917-dade-d376-8907-cf7d3aebfee9.png">

Build Remote Catalogのチェックを入れます。これを入れないと更新できませんでした。
次に"RemoteBuildPath"でローカルでの書き出し先を指定します。
デフォルトのままにしました。
"RemoteLocalPath"は読み込むサーバー先のURLを書きます。
例えば "https://test.com/" の場合は "https://test.com/[BuildTarget]"
*[BuildTarget]はProjectのBuild設定になります。例えば、MacのStandaloneだとStandaloneOSXとかになります。*
*ここのURL間違えてもエラーなどは出ませんでしたので間違えがないように気をつけた方がいいです。*

<img width="458" alt="スクリーンショット 2019-08-03 01.29.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/b090d9ec-8006-aa8a-5c50-a53bf0fafe0b.png">

次に先ほど作成したPacked Asset Groupの設定を行います。
<img width="360" alt="スクリーンショット 2019-08-03 01.39.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/88de9a17-3838-0e7b-af16-5fece2770996.png">

こちらはBuild PathをRemoteBuildPath
LoadPathをRemoteLoadPathに変更します。
<img width="466" alt="スクリーンショット 2019-08-03 01.40.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/a23b5170-fb9e-dde8-9b20-d9a46b775649.png">

あとはAssetをBuildします。
<img width="583" alt="スクリーンショット 2019-08-03 01.58.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/0bdf51e7-bc92-5f18-d55b-787eb35dc679.png">


ビルドしたAssetは"RemoteBuildPath"に配置されます。
今回の場合はUnity Projectの"ServerData/StandaloneOSX"に書き出されます。

そしてこれをサーバーにアップロードし、先ほどのAttachしたScriptのInspectorでサーバーにアップした
Asset名をして,Playすると読み込まれます。
AsyncOperationHandleのPercentCompleteを使用するとProgress Barっぽいのができるみたいですが、
参考
https://docs.unity3d.com/Packages/com.unity.addressables@0.7/manual/AddressableAssetsGettingStarted.html

0と1しか戻ってこなく、フォーラムを見るとまだ調整中っぽいでした。
https://forum.unity.com/threads/asyncoperationhandle-percentcomplete-not-updating-when-given-as-a-parameter-in-function.668317/#post-4761905


##Assetを更新する方法
Assetが更新した場合の書き出し手順になります。

まず、更新をチェックするために先にProjectのビルドを行います。
StandaloneなどでAssetのロードが正常に動いてるのを確認してから
Prefabを色などを変更してみます。

次に"Prepare for Update Content"で更新したコンテンツをチェックします。
選択するとプロンプトが出るので
/Assets/Addressable/[OS]/addressables_content_state.bin
を選択します。
ここで変更がチェックされるはずですが、うまくチェックできてませんでした。
<img width="585" alt="スクリーンショット 2019-08-03 02.26.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/c67863ba-71fe-9507-476a-dfc659e65d57.png">

変更がチェックされてないのですが、そのまま書き出します。
<img width="586" alt="スクリーンショット 2019-08-03 02.43.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11402/bfaf51ce-293f-3eda-569f-8f1aa8dce514.png">

先ほどと同じlocalPathに書き出されるので、そのデータを再度サーバーにアップロードします。
そして、ビルドしたもので再度見るとAssetが更新されてるのが確認できます。


##参考サイト

- https://qiita.com/yukiarrr/items/2e2b21530600ccf18f70
- https://www.youtube.com/watch?v=U8-yh5nC1Mg