【Unity】Addressable Assets Systemを使ってサーバに配置したAsset Bundleを読み込む方法

#はじめに
サーバに配置したAsset BundleをAddressableに読み込む方法についてです。
Addressable Assets System(AAS)は**Unity2018.2以降**でpreview機能として提供されており、現時点での最新バージョンは**1.1.4 preview**です。

あくまで**導入と実装**が目的なので、ここではAddressableの詳しい仕様については書きません。
気になる方や内部構造を深く知りたい方はこちらの方々の記事をご覧ください。

- [Addressable Assets Systemを完全に理解する](https://qiita.com/k7a/items/b4fd298bcb64dc968ad1)
- [【Unite Tokyo 2018】そろそろ楽がしたい！新アセットバンドルワークフロー&リソースマネージャー詳細解説](https://www.youtube.com/watch?v=Rls8e7tZUNE) (Unite Tokyo 2018 YouTube動画)

#実行環境
*Windows10 64bit, Unity2018.3.3f1, Addressable Assets System 1.1.4-preview, VirtualBox CentOS7, PuTTY*

#おおまかな流れ
1. Unityでビルドして.bundleファイルを作成
2. サーバに配置
3. Unityからサーバ上のAssetBundleにリモートアクセス、読み込む

#Unity側の操作
###Addressable Assets Systemの導入
① UnityEditorメニューのWindow->Package Managerを開く
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/209d58c9-dac3-b7fd-22ed-0a96b7635682.png)
② Advanced->Show Preview Packageを押してメニューを開く
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/b87b0f59-af57-5d6d-dae0-9683e9a154ef.png)
③ Addressableという項目を開き、バージョン最新(1.1.4)でInstallボタンを押す
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/dd86cf7b-45b0-ba78-d017-953c5d5492d0.png)
④ インストールが完了したら、Window->Asset Management->Addressablesが追加されるので開く
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/501accbb-3d76-75d7-4dc1-6ce719c77d21.png)
⑤ Create Addressables Settingを押す
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/b965d485-25a9-16c5-11d7-516c03819b69.png)
⑥ Default Local Groupを右クリックする
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/e62560b2-9798-d7fe-7244-9813ca71864b.png)
⑦ Simplify Entry Nameをクリックしてパスを省略形にする(お好みで)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/18f11677-0056-d46f-742c-7489c583dea0.png)

###スクリプトの作成
① 適当にPrefabを作る
② 適当にスクリプトを作成し、オブジェクトにアタッチする
（こちらではAddressableInstantiateというスクリプトを生成しました）
③ 先ほど作ったPrefabをInspectorの「None(AddressableAsset)」にアタッチする
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/a16e66bc-ba85-e1f0-843c-c02565011c5f.png)
② 先ほどのスクリプトに以下のコードを書く

```C#:PrefabをLoadして生成するスクリプト
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class AddressableInstantiate : MonoBehaviour
{
    public AssetReference m_Ref;
    GameObject m_Result = null;

    private void Start() {
        Addressables.LoadAssetAsync<GameObject>(m_Ref).Completed += OnLoadDone;
    }

    void OnLoadDone(AsyncOperationHandle<GameObject> handle) {
        if (handle.Status == AsyncOperationStatus.Succeeded) {
            m_Result = handle.Result;
            m_Result = Instantiate(m_Result, Vector3.zero, Quaternion.identity);
        }
    }
}
```
###AddressableAssetsSystemの設定
① Assets/AddressableAssetsData/AssetGroups/Default Loacal Groupを開く
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/69aa949a-3f8f-6a5c-33c7-5a80c9b560b0.png)
② 「Build Path」と「Load Path」のプルダウンメニューから、それぞれ「RemoteBuildPath」「RemoteLoadPath」に変更
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/bbe03f9c-f472-f041-df9b-c0cb8c75558e.png)
③ Assets/AddressableAssetsData/AssetGroups/Built In Dataを開く
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/db31bb8b-092d-4f62-57dd-3fc2a7c477fc.png)
④ 「Include Resources Folders」と「Include Build Setting Scenes」のチェックを外す
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/02dc5925-0852-d1fd-74c8-ae0718c0b18f.png)
※こちらの環境では④の手順を行わないでビルドすると以下のようなエラーが発生しました
参考：https://forum.unity.com/threads/nullreferenceexception-photon-bolt-create-errors-when-building.703850/
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/7837ce43-526d-696d-01be-ee32cac76378.png)
⑤ Play Mode Script->Packed Play Modeを選択する
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/46454f13-7300-a30f-754e-6e8941b08911.png)
⑥ Assets/AddressableAssetsData/AddressableAssetSettingsを開き、「RemoteLoadPath」の値をローカルサーバのアドレスに変更する
![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/16237e6d-1421-315c-efbc-f41de687d0df.png)
⑦ Build->Build Player Contentを押してビルドをする
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/ac0f7d1c-86e6-4bf9-874d-7a6b86a1cddf.png)
⑧ 「Unityのプロジェクトパス/ServerData」の中にビルド後に出力された.bandleデータがあることを確認する

#サーバ側の操作
###.bundleデータを配置する
こちらではVirtualBoxでCentOS7を動かしてローカルサーバに配置しました。
環境ごとに微妙に操作が違う箇所もあると思いますが、おおまなか流れは共通だと思います。
① サーバを起動し公開ディレクトリに移動
② 公開ディレクトリに「StandaloneWindows64」ディレクトリを作成

```shell:
> mkdir /var/www/html/StandaloneWindows64
```
③ 作成したディレクトリにビルド後のファイル類を移動
④ 実行権限の変更を行う

```shell:
> sudo chmod 777 /var/www/html/StandaloneWindows64/*
```
※補足：StandaloneWindows64は[UnityEditor.EditorUserBuildSettings.activeBuildTarget]と等しく、
下画像の黄色で囲った部分がそれと対応しています。
今回はPCでテストを行ったためStandaloneWindows64となっています。
![17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401086/75bade1a-2546-75c9-938a-9cc53b1f856c.png)
公開ディレクトリにファイルを配置していざUnityで実行すると、パスが解決できなかったり、アクセス権がないために取得できないなど、ここが一番ひっかかるポイントが多いと思います。

#最後に
いかがだったでしょうか。
実装が成功するとリモートからPrefab Bundleを読み込み、InstantiateしてSceneに表示される様子が確認できると思います。