【Unity】Addressable Assets System個人的メモ帳


個人的なAddressableAssetsSystemのメモです、
どこかで誰かの役にたつといいなぁ　くらいで書いてます。

導入方法に関しては他の方がいっぱい紹介しているのでそちら参照

変数名とかメソッド名とか適当にやってるから持ってく時はちゃんと命名し直してあげてね。

対象バージョンは　2018/09/13　現在
Unity 2018.3.0b1
AddressableAssetsSystem　0.3.5-Preview

です

##コード上からアセットをグループに追加する
やはり手動で入れるのはめんどくさい
ので
適当にメニュー押したら勝手に登録してくれるようにしときます。

```c#

static string _addressableAssetsPath = "Assets/AddressableAssets/";

    [MenuItem("AddressableAssets/ConvertAddressableAssetsData")]
    public static void ConvertAddressableAssetsData()
    {
        var aaSettings = AddressableAssetSettings.GetDefault(false, false);

        var files = System.IO.Directory.EnumerateFiles(_addressableAssetsPath, "*", System.IO.SearchOption.AllDirectories);
        foreach(var file in files)
        {
            var ex = Path.GetExtension(file);
            var path = file.Replace('\\','/');
            if (ex == ".meta") continue;
            var basePath = path.Replace(_addressableAssetsPath, "");
            var baseDirectory = basePath.Split('/')[0];
            var group = aaSettings.groups.Find(g => g.Name == baseDirectory);
            if (group == null)
            {
                group = aaSettings.CreateGroup(baseDirectory, typeof(BundledAssetGroupProcessor), false, false);
                // 追加した場合は取り直しておく
                aaSettings = AddressableAssetSettings.GetDefault(false, false);
            }

            //　グループに対してAssetを登録
            var en = aaSettings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(file), group);

            // Addressを登録
            en.address = basePath.Replace(ex, "");
        }
    }
```
ゆるく解説すると
指定フォルダ以下のファイルをピックアップ
_addressableAssetsPathパスの直下にあるディレクトリをグループ名として検索
なければそれでグループ作成
グループに対してアセットを登録して
Addressを_addressableAssetsPathパスの以下からファイルまでのでとりあえず更新

一応こんなんで
![dasdasdass.gif](https://qiita-image-store.s3.amazonaws.com/0/275100/800e4d7e-2236-542b-e7d0-a87e6897b16a.gif)
ぽちっとなすれば登録される
ちょっと楽になるゾ

###0.3.5以降の話
0.3.5でBundledAssetGroupProcessorがinternalになったので
CreateGroupに入れる場合は以下のようにすると良い

```c#

        var asm = Assembly.Load("Unity.Addressables.Editor");
        var type = asm.GetType("UnityEditor.AddressableAssets.BundledAssetGroupProcessor");
略
foreach(var file in files)
        {
            var ex = Path.GetExtension(file);
            var path = file.Replace('\\','/');
            if (ex == ".meta") continue;
            var basePath = path.Replace(_addressableAssetsPath, "");
            var baseDirectory = basePath.Split('/')[0];
            var group = aaSettings.groups.Find(g => g.Name == baseDirectory);
            if (group == null)
            {
                group = aaSettings.CreateGroup(baseDirectory, type, false, false);
                // 追加した場合は取り直しておく
                aaSettings = AddressableAssetSettings.GetDefault(false, false);
            }
```

##バッチビルドでビルドするときにBundleModeを指定する
何故か現状ビルド後とかアセット追加後のインポートが終わるとBundleModeがPackTogetherになっちゃう。
ので
ビルドするときに指定しとく
もしかしたら他のいい方法あるかもしれない。

```C#

//デフォ設定持ってくる
var aaSettings = AddressableAssetSettings.GetDefault(false, false);
        aaSettings.groups.ForEach(g =>
        {
            //SetDataで書き込む
            g.Data.SetData("BundleMode", BundledAssetGroupProcessor.BundleMode.PackSeparately);
        });

        // とりあえずビルドするだけ
        var bs = BuildScript.PrepareRuntimeData(
            true,
            arg.isDevelopmentBuild,
            false,
            true,
            false,
            setting.BuildTargetGroup,
            setting.BuildTarget
            );
```
まさか設定方法がData.SetDataとは・・・
多分コレ　変えた最後のグループのOnSetData？が呼ばれた後にビルドしないと
たまにきちんと更新されてないことがあるっぽい。

###0.3.5以降の話
0.3.5からはグループの設定がScriptableObjectに保存されるようになっていたので
ビルド時のData.SetDataは要らない
BundledAssetGroupProcessorがInternalになったのでそもそもこの方法はエラーになるので注意
専用の管理ウィンドウとか作る場合だけ注意がいるかな

---