[unity]Addressable Asset System のファイル登録を自動化したい

Image Sprite Sound ファイルをプロジェクトに突っ込むだけで、自動的に Addressable Asset System(AAS) にも登録されるコードを紹介します。

ソースコード

using System.IO;
using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;

public class PostProcessor : AssetPostprocessor
{
    const string STREAMINGASSETS_RAWDATA = "StreamingAssets_RawData";

    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        var settings = AddressableAssetSettingsDefaultObject.Settings;

        foreach (string asset in importedAssets)
        {
            if (asset.IndexOf(STREAMINGASSETS_RAWDATA) < 0)
            {
                continue;
            }

            string name = asset.Remove(0, asset.IndexOf(STREAMINGASSETS_RAWDATA) + STREAMINGASSETS_RAWDATA.Length + 1);

            if (name.IndexOf("/") >= 0)
            {
                string groupname = name.Substring(0, name.IndexOf("/"));
                string assetname = name.Remove(0, name.IndexOf("/")+1);

                var group = settings.FindGroup(groupname);

                if (group == null)
                {
                    var groupTemplate = settings.GetGroupTemplateObject(0) as AddressableAssetGroupTemplate;
        
                    // Group entry
                    AddressableAssetGroup newGroup = settings.CreateGroup(groupname, false, false, true, null, groupTemplate.GetTypes());
                    groupTemplate.ApplyToAddressableAssetGroup(newGroup);
        
                    AssetDatabase.SaveAssets();
                        
                    group = settings.FindGroup(groupname);
                    if (group == null)
                    {
                        Debug.LogError($"グループの作成に失敗. {groupname}");
                        continue;
                    }
                }

                string label = Path.GetDirectoryName(assetname).Replace('\\', '/');

                // Addressable entry
                var guid = AssetDatabase.AssetPathToGUID(asset);
                settings.CreateOrMoveEntry(guid, group);
                AssetDatabase.SaveAssets();

                var entry = group.GetAssetEntry(guid);
                // Simplify addressable name
                entry.SetAddress(Path.GetFileNameWithoutExtension(assetname));
                // Set Label
                if (string.IsNullOrEmpty(label) == false)
                {
                    entry.SetLabel(label, true, true);
                }
                AssetDatabase.SaveAssets();
            }
        }
    }
}

使い方

Assets/ の下に StreamingAssets_RawData/ というフォルダを作り、その下にファイルを放り込むと自動的に Addressable Groups にも情報が登録されます。
StreamingAssets_RawData というフォルダ名が気に入らない場合は、コードの STREAMINGASSETS_RAWDATA の値を変更してください。

16~19行目で弾いてるだけなので、複数のフォルダに対応するのもそれほど難しくないと思います。

1つ目のフォルダが AAS のグループ名、2つ目以降のフォルダはラベル名になります。

例えば database/db/db2/Data_Memory.asset であれば、グループは database、ラベルは db/db2 となります。
(グループやラベルは、なければ自動的に作成されます)

このへんのルール付けはアプリによっても異なると思うので、好みに応じてコードを改変してください。
アドレス名も自動的に Simplify されますが、コードで Simplify (したような)文字列を登録してるだけなので、必要があれば変更してください。

ラベルは、ファイル移動には対応していません

一旦登録したファイルを移動しても Addressable Group のパスは追従しますが、サンプルコードだとラベルなどは追従しないので注意してください(movedAssets を上手いことすれば対応できると思います)。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA