[Unity]AddressableAssetSystemでゲームステージのPrefabをダウンロードする

# 概要
AddressableAssetSystemでゲームステージのPrefabをサーバーからダウンロードする流れをまとめます。
詳しい技術的な解説は載せませんが、とりあえず一回手を動かして動作確認してみたい！という方用の記事です。
# 本文
## 環境の準備
3D(URP)で新規プロジェクトを作って
![スクリーンショット 2023-03-19 17.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f8c17535-9e38-fd09-7a88-30fc87e8f1a3.png)

PackageManagerでAddressablesをインストールします。
![スクリーンショット 2023-03-19 18.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/38de8051-7747-73dd-2de6-1e2dc23721c3.png)


今回はゲームステージをダウンロードするテストなのでスクショのようなPrefabを用意しました。テストするだけなら単純にキューブひとつだけでも大丈夫です。
![スクリーンショット 2023-03-19 17.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/d9b727bc-765a-a2ea-3307-13d223724f2a.png)

## Addressableの準備
Window > Asset Management > Addressables > GroupでAddressables Groupsを開きます。
ウィンドウの中に「Create Addressables Settings」というボタンがあるのでそれを押して開始します。
![スクリーンショット 2023-03-19 17.32.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/0d3d8568-198e-7cd3-a48e-01726ced21ff.png)

New > Packed Assetsでグループを新規作成します。生成されたグループ(Packed Assets)を右クリック > Renameで適当なグループ名に変更してください。（今回はRemoteGroupにしました）
![スクリーンショット 2023-03-19 17.34.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f5301942-9340-9367-7200-06b308ee5950.png)

PrefabをRemoteGroupにドラッグ&ドロップするとPrefabがAddressableAssetの管理対象に登録されます。（Scene上のゲームオブジェクト類じゃない点にご注意ください！）
![スクリーンショット 2023-03-19 17.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/21e632ee-3743-cafb-e953-0b6d959639d4.png)

続いてRemoteGroupを選択してInspectorを確認します。
Build & Load Pathsを\<custom\>に変更
Build PathをRemote.BuildPathに変更
LoadPathをRemote.LoadPathに変更します。
![スクリーンショット 2023-03-19 17.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9dc59a7a-d693-af7e-3262-fd520754738e.png)

Play Mode Script > Use Existing Buildを選択しておきます
![スクリーンショット 2023-03-19 21.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/01c5fc5c-c1ca-872d-b6a8-72e1b5566e39.png)


ProjectウィンドウからAssets/AddressableAssetsData/AddressableAssetSettings.assetを選択してInspectorを確認します。
Player Version Overrideに適当な文字列を指定します（今回は1にしました）
Build Remote Catalogにチェックを入れます。
![スクリーンショット 2023-03-19 17.57.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/cb3697a3-4f6e-8d67-61bc-fc001819dcb1.png)

次にメニューからWindow > Asset Management > Addressables > Profilesを選択します。
![スクリーンショット 2023-03-19 21.39.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/3ed06f1b-7d08-dc07-3f0a-cd6166b27cca.png)

Addressables Profilesウィンドウが表示されますのでRemoteはCustomを選んでRemote.LoadPathにデータをアップロードする予定のサーバーのURLを入力します。**アップロードするファイルの親になるフォルダ**までを指定したURLになります（URLがまだ決まってなければ後で設定しても大丈夫です）
![スクリーンショット 2023-03-19 21.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/82166b53-792d-b4d2-5e70-44b6df25e36c.png)


## ビルド
Addressables GroupsでBuild > New Build > Default Build Scriptを選択するとビルドが開始されます。
![スクリーンショット 2023-03-19 18.20.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/4f94ccbe-3687-8172-9391-17a9398586ed.png)

:::note warn
設定を色々いじってるとAddressableが思ったように動いてくれなくなる時があります。原因がわからなくて困ったときは
Addressables GroupsでBuild > Clean Build > Allを一度して、再度Build > New Build > Default Build Scriptをすると上手くいく事もあります。
![スクリーンショット 2023-03-19 21.35.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/71338000-e9e8-75ce-87d6-c561da2ba0b6.png)

:::

ビルドで作成されたファイルはここまでの設定の中にあるBuild Pathで指定されたフォルダの中に作成されます。Finderやエクスプローラでプロジェクトのフォルダから今回の例では「ServerData/StandaloneOSX」を辿るとファイルがあります。フォルダの中のファイルをFTPでサーバーにアップロードします。(サーバー上ファイルのパーミッションは644(読み込み専用ファイル)になっていれば正常に動作できると思います)
![スクリーンショット 2023-03-19 21.28.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f18998de-7fb7-5f23-d09c-604e45f21499.png)
これでAddressableの下準備ができました。

## 動作確認
以下のスクリプトを作成してHierarchy上に作成したオブジェクトに貼り付けてください。(AssetReferenceGameObjectにはゲームステージPrefabをドラッグ&ドロップします)

:::note info
Projectウィンドウ上のPrefab、Addressables Groups上のPrefabどちらでも大丈夫です。
:::
動作確認のためゲームステージPrefabはHierarchy上から消しておきます（実行に合わせてゲームステージが表示されたら成功です）

![スクリーンショット 2023-03-19 21.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/9f300fd7-a1e4-8d09-c92c-55d75d95c211.png)


```cs

using UnityEngine;
using UnityEngine.AddressableAssets;

public class AddressableSample : MonoBehaviour
{
    [SerializeField] private AssetReferenceGameObject assetReferenceGameObject;

    private GameObject _spawnedGameObject;
    
    private void Start()
    {
        assetReferenceGameObject.InstantiateAsync().Completed +=
            (asyncOperation) => _spawnedGameObject = asyncOperation.Result;
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // インスタンスをリリースする
            assetReferenceGameObject.ReleaseInstance(_spawnedGameObject);
        }
    }
}
```
実行するとサーバーからダウンロードされたゲームステージが表示されました。成功です！
スペースキーを押すとインスタンスもしっかりリリースされることが確認できると思います。
![スクリーンショット 2023-03-19 22.01.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/43589ae8-b8e7-3425-4fb1-10ccb71297d1.png)

## もっと詳しく動作確認したいときは

ProjectウィンドウからAssets/AddressableAssetsData/AddressableAssetSettings.assetを選択してInspectorを確認します。
Send Profiler Eventsにチェックを入れます。
![スクリーンショット 2023-03-20 8.06.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/3930befa-b544-f9a9-20f8-d26cb53a0332.png)

メニューからWindow > Asset Management > Addressables > Event Viewerを選択すると
![スクリーンショット 2023-03-20 8.03.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/e97be0ce-4aa9-6ba3-c198-22cd8dc87038.png)

Addressables Event Viewerが表示されます。この画面でメモリの使用状況などを確認することができます。
![スクリーンショット 2023-03-20 8.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/3880bf74-6bb1-e7dd-f2cc-42a81a579d2e.png)